ROLLUP
ROLLUP создает одну или несколько выходных записей из одной или нескольких входных записей. Может отправлять разные записи на разные выходные порты, указанные пользователем. Записи должны быть отсортированы перед подачей в этот шаг.
Метаданные на разных выходных портах могут различаться.
Порты ROLLUP:
Тип порта | Номер | Обязательный | Описание | Метаданные |
---|---|---|---|---|
Input | 0 | да | Для входных записей | любые |
Output | 0 | да | Для выходных записей | |
1-N | нет |
Атрибуты ROLLUP:
Атрибут | Обязательный | Описание | Возможные значения |
---|---|---|---|
groupKeyFields | да | Ключ, по которому записи считаются включенными в одну группу. Выражается в виде последовательности имен отдельных входных полей, разделенных друг от друга символом «#». | name; salary |
groupAccumulatorMetadataId | дa | Идентификатор метаданных, которые служат для создания групповых аккумуляторов. | metadataName |
transform | да | Алгоритм обработки данных. Функции для преобразования на шаге ROLLUP описаны в таблице ниже. |
|
Схема работы шага ROLLUP

Функции шага ROLLUP
Когда приходит первая запись, срабатывает initGroup(groupAccumulatorMetadataId). Он инициализирует группу записей, объединенных групповым акумулятором groupAccumulatorMetadataId.
Параметр | Значение |
---|---|
Обязательный | Да |
Входные параметры |
|
Возвращает | void |
Вызов | Вызывается по одному разу для первой входной записи каждой группы. Вызывается перед updateGroup(groupAccumulatorMetadataId). |
Описание | Обновляет информацию для конкретной группы. |
Пример |
|
Далее для каждой записи, которая соответствует этой группе, вызывается updateGroup(groupAccumulatorMetadataId).
Параметр | Значение |
---|---|
Обязательный | Да |
Входные параметры |
|
Возвращает |
если true, то вызывается если false, то граф завершится с ошибкой. |
Вызов |
Вызывается многократно (по одному разу для каждой входной записи группы, включая первую и последнюю запись). Вызывается после того, как функция |
Описание | Инициализирует информацию для конкретной группы. |
Пример |
|
Если updateGroup вернул true, то для каждой записи еще вызывается updateTransform(counter, groupAccumulatorMetadataId) столько раз сколько указан counter внутри, пока не вернётся SKIP.
Параметр | Значение |
---|---|
Обязательный | Да |
Входные параметры |
Целочисленный счетчик (начинается с 0, указывает количество созданных записей. Должен быть завершен, как показано в примере ниже. Вызовы функций заканчиваются, когда возвращается
Если |
Возвращает | целочисленные значения |
Вызов |
Вызывается неоднократно, как указано пользователем. Вызывается после того, как |
Описание |
Создает выходные записи на основе информации об отдельных записях. Если |
Пример |
|
Когда группа закончилась, отрабатывает finishGroup(groupAccumulatorMetadataId).
Параметр | Значение |
---|---|
Обязательный | Да |
Входные параметры |
Метаданные, указанные пользователем. Если |
Возвращает |
если true, то вызывается если false, то граф завершится с ошибкой. |
Вызов |
Вызывается повторно, один раз для последней входной записи каждой группы. Вызывается после того, как |
Описание |
Если |
Пример |
|
Затем выполняется transform(counter, groupAccumulatorMetadataId).
Параметр | Значение |
---|---|
Обязательный | Да |
Входные параметры |
целочисленный счетчик (начинается с 0, указывает количество созданных записей. должен быть завершен, как показано в примере ниже. Вызовы функций заканчиваются, когда возвращается SKIP.)
Если |
Возвращает | целочисленные значения |
Вызов |
Вызывается неоднократно, как указано пользователем. Вызывается после того, как |
Описание |
Создает выходные записи на основе всех записей всей группы. Если функция |
Пример |
|
Входные записи или поля
Входные записи или поля доступны в функциях initGroup()
, updateGroup()
, finishGroup()
, updateTransform()
, transform()
.
Выходные записи или поля
Выходные записи или поля доступны в функциях updateTransform()
, transform()
.
Групповой аккумулятор
Групповой аккумулятор доступен в функциях initGroup()
, updateGroup()
, finishGroup()
, updateTransform()
, transform()
.
Пример. Сгруппировать записи.
На вход в ROLLUP подаются записи, некоторые из которых имеют одинаковое значение поля "num". Нужно соединить значения всех полей, у которых одинаковое значение num и подать на выходной порт.
- Создать метаданные.
rollin:
- stra (string),
- num (integer),
- stro (string),
- Поместить компоненты на рабочую область.
- Соединить шаги ребрами и назначить им метаданные.
- Задать значения атрибутов шагу ROLLUP.
groupKeyFields = "num",
groupAccumulatorMetadataId = "rollin",
transform =
function initGroup(groupAccumulator) {
groupAccumulator.s = null;
groupAccumulator.t = 0;
groupAccumulator.r = null;
}
function updateGroup(groupAccumulator) {
groupAccumulator.s = groupAccumulator.s + $in[0].stra;
groupAccumulator.t = groupAccumulator.t + $in[0].num;
groupAccumulator.r = groupAccumulator.r + $in[0].stro;
return true;
}
function finishGroup(groupAccumulator) {
return true;
}
function updateTransform(counter, groupAccumulator) {
return SKIP;
}
function transform(counter, groupAccumulator) {
if(counter > 0) return SKIP;
$out[0].s = groupAccumulator.s;
$out[0].t = groupAccumulator.t;
$out[0].r = groupAccumulator.r;
return ALL;
}
- Результатом выполнения графа будут строки из входных записей, значения полей которых соединенны при условии наличия одинакового значения поля "num".