---
metadata:
  - name: generator
    content: Diplodoc Platform v5.50.6
alternate:
  - https://ytsaurus.tech/docs/en/user-guide/data-processing/operations/map.md
  - https://ytsaurus.tech/docs/ru/user-guide/data-processing/operations/map.md
---
> **Documentation Index:** Fetch the complete configuration index at https://ytsaurus.tech/docs/ru/llms.txt

<!-- source: ru/_includes/user-guide/data-processing/operations/map.md -->
# Map

Операция Map может состоять из одного или нескольких джобов. На вход каждому джобу поступает часть данных из входных таблиц, которые обрабатываются пользовательским скриптом. Результат записывается в выходную таблицу.

У операции Map есть два режима: **unordered** (по умолчанию) и **ordered**. Включение режима ordered регулируется настройкой `ordered=%true` в спецификации операции. Режим влияет на гарантии, которые система предоставляет относительно входных данных для джобов. Любой из двух режимов соблюдает базовую гарантию операции Map: каждая выходная таблица составляется как объединение результатов всех успешно завершившихся джобов, при этом каждая строка из входных данных окажется на входе ровно одного успешно завершившегося джоба.

- В режиме unordered нет **никаких** гарантий сверх описанной выше. В частности:
  - Строки одной входной таблицы могут попадать в произвольные джобы без каких-либо свойств непрерывности; в частности, один маппер может получить первую и третью строку таблицы, а другой — вторую и четвёртую.
  - Строки одной входной таблицы могут попадать в джоб в произвольном порядке, не обязательно в порядке возрастания номера строки.
  - Строки разных входных таблиц могут попадать в один джоб в произвольном порядке, в том числе вперемешку; то есть сначала может следовать строка таблицы A, потом — таблицы B, а потом снова строка таблицы A.

- Режим ordered работает следующим образом:
  - Конкатенирует входные данные в порядке их указания в секции `input_table_paths` входных данных.
  - Получившийся совокупный вход разделяет на непрерывные отрезки, каждый из которых подается на вход отдельному джобу.
  - Если входных таблиц несколько, то некоторые джобы **могут** получить на вход строки из нескольких таблиц, если джоб попал на границу между двумя таблицами в описанной выше конкатенации.
  - Каждый джоб читает свой отрезок данных строго по порядку в описанной выше конкатенации: сначала по порядку следования таблиц, а внутри одной таблицы — по возрастанию номеров строк.
  
Режим ordered даёт больше гарантий, которыми можно пользоваться в отдельных случаях, но менее эффективен, так как накладывает больше ограничений. Режим unordered активно пользуется возможностью адаптивно читать входные данные с большой степенью параллельности из разных чанков, компенсируя замедления отдельных дисков со входными данными, поэтому в общем случае более эффективен. Режим unordered может произвольным образом перегруппировывать строки в пуле ещё не обработанных входных данных, в частности, вход джоба, завершившегося неудачно (aborted или failed), может быть произвольным образом перегруппирован и обработан в нескольких новых джобах.

Обратите внимание, опция `ordered=%true` регулирует способ разбиения входных таблиц на джобы, но **не обеспечивает** никакой дополнительной сортировки лежащих в них данных, кроме той, которая была изначально. 

Порядок следования выходных данных определяется как режимом операции, так и наличием на выходной таблице сортированной схемы (или атрибута `sorted_by` на пути к ней в спецификации операции). 

Возможны следующие сценарии:

- Если выходная таблица сортированная, то выполняется следующее:
  - Выходные данные каждого джоба проверяются на сортированность относительно схемы выходной таблицы либо схемы, указанной на пути выходной таблицы. Если один из джобов вывел несортированную последовательность строк, то операция завершается ошибкой.
  - Если все выходные чанки сортированные, то в конце работы операции они «пытаются» встать в соответствии с порядком сортировки на выходной таблице. Если оказывается, что два чанка перекрывают друг друга по граничным ключам и при любом варианте взаимного расположения их строки не образуют сортированную последовательность, операция завершается ошибкой. Чанки, состоящие из единственного и совпадающего ключа, упорядочиваются между собой произвольным недетерминированным образом.
- Если выходная таблица несортированная, а режим операции unordered, то выходные чанки упорядочиваются между собой произвольным недетерминированным образом.
- Если выходная таблица несортированная, а режим операции ordered, то выходные чанки упорядочиваются в соответствии с описанным выше глобальным порядком следования джобов.

Ordered-версия Map операции обладает свойством детерминированности набора и порядка строк выходной таблицы при условии детерминированности логики мапперов вне зависимости от числа джобов в операции и порядка их выполнения. Данное свойство не выполнено для unordered-версии Map.

Общие параметры для всех типов операций описаны в разделе [Настройки операций](https://ytsaurus.tech/docs/ru/user-guide/data-processing/operations/operations-options.md).

У операции Map поддерживаются следующие дополнительные параметры (в скобках указаны значения по умолчанию, если заданы):

* `mapper` — пользовательский скрипт.
* `input_table_paths` — список входных таблиц с указанием полных путей (не может быть пустым).
* `output_table_paths` — список выходных таблиц.
* `job_count`, `data_weight_per_job` (256 Mb) — опции, которые указывают, сколько джобов должно быть запущено. Имеют рекомендательный характер. Опция `job_count` имеет приоритет над `data_weight_per_job`. Если указать `job_count` меньшим либо равным `total_input_row_count`, то гарантируется, что количество джобов будет точно соблюдено, если это не противоречит ограничению на максимальное число джобов в операции. В частности, если `job_count` равен `total_input_row_count`, то в каждый джоб попадёт ровно одна строка, если `job_count` равен единице, то будет запущен ровно один джоб.
* `ordered` — управляет способом разбиения входа по джобам.
* `auto_merge` — словарь, содержащий настройки автоматического объединения выходных чанков небольшого размера. По умолчанию автоматическое слияние отключено.

## Пример спецификации

```yaml
{
  pool = "my_cool_pool";
  job_count = 100;
  input_table_paths = [ "//tmp/input_table" ];
  output_table_paths = [ "//tmp/output_table" ];
  mapper = {
    command = "cat";
    memory_limit = 1000000;
  }
}
```
<!-- endsource: ru/_includes/user-guide/data-processing/operations/map.md -->