ROLLUP

ROLLUP создает одну или несколько выходных записей из одной или нескольких входных записей. Может отправлять разные записи на разные выходные порты, указанные пользователем. Записи должны быть отсортированы перед подачей в этот шаг.

Метаданные на разных выходных портах могут различаться.

Порты ROLLUP:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входных записейлюбые
Output0даДля выходных записей
1-Nнет

Атрибуты ROLLUP:

АтрибутОбязательныйОписаниеВозможные значения
groupKeyFieldsдаКлюч, по которому записи считаются включенными в одну группу. Выражается в виде последовательности имен отдельных входных полей, разделенных друг от друга символом «#».name; salary
groupAccumulatorMetadataIdдaИдентификатор метаданных, которые служат для создания групповых аккумуляторов.metadataName
transformдаАлгоритм обработки данных. Функции для преобразования на шаге ROLLUP описаны в таблице ниже.
function initGroup(groupAccumulator) {
    groupAccumulator.metaFieldName = 0;
}

function updateGroup(groupAccumulator) {
    groupAccumulator.metaFieldName = groupAccumulator.metaFieldName + $in[0].metaFieldName;
    return false;
}

function finishGroup(groupAccumulator) {
    return true;
}

function updateTransform(counter, groupAccumulator) {
    return SKIP;
}

function transform(counter, groupAccumulator) {
    if(counter > 0) return SKIP;
    $out[0] = $in[0];
    $out[0].metaFieldName = groupAccumulator.metaFieldName;
    return ALL;
}

Схема работы шага ROLLUP

Схема работы шага ROLLUP

Функции шага ROLLUP

Когда приходит первая запись, срабатывает initGroup(groupAccumulatorMetadataId). Он инициализирует группу записей, объединенных групповым акумулятором groupAccumulatorMetadataId.

ПараметрЗначение
ОбязательныйДа
Входные параметры

groupAccumulatorMetadataId - имя метаданных, указываемое пользователем. Если groupAccumulatorMetadataId не определён, выполнение графа завершится с ошибкой.

Возвращаетvoid
ВызовВызывается по одному разу для первой входной записи каждой группы. Вызывается перед updateGroup(groupAccumulatorMetadataId).
ОписаниеОбновляет информацию для конкретной группы.
Пример

groupAccumulatorMetadataId = out_rlp

function initGroup(out_rlp) {
  group = $in[0].field;
  num = 0;
}

Далее для каждой записи, которая соответствует этой группе, вызывается updateGroup(groupAccumulatorMetadataId).

ПараметрЗначение
ОбязательныйДа
Входные параметры

groupAccumulatorMetadataId - имя метаданных, указываемое пользователем. Если groupAccumulatorMetadataId не определён, выполнение графа завершится с ошибкой.

Возвращает

если true, то вызывается updateTransform(counter, groupAccumulatorMetadataId)

если false, то граф завершится с ошибкой.

Вызов

Вызывается многократно (по одному разу для каждой входной записи группы, включая первую и последнюю запись). Вызывается после того, как функция initGroup(groupAccumulatorMetadataId) уже была вызвана для всей группы.

ОписаниеИнициализирует информацию для конкретной группы.
Пример
function updateGroup(out_rlp) {
  num = $in[0].num + num;

  return true;
}

Если updateGroup вернул true, то для каждой записи еще вызывается updateTransform(counter, groupAccumulatorMetadataId) столько раз сколько указан counter внутри, пока не вернётся SKIP.

ПараметрЗначение
ОбязательныйДа
Входные параметры

Целочисленный счетчик (начинается с 0, указывает количество созданных записей. Должен быть завершен, как показано в примере ниже. Вызовы функций заканчиваются, когда возвращается SKIP.)

<metadata name> groupAccumulatorMetadataId (метаданные, указанные пользователем).

Если groupAccumulatorMetadataId не определен, выполнение графа завершится с ошибкой.

Возвращаетцелочисленные значения
Вызов

Вызывается неоднократно, как указано пользователем. Вызывается после того, как updateGroup(groupAccumulatorMetadataId) возвращает значение true. Функция вызывается до тех пор, пока не будет возвращен SKIP.

Описание

Создает выходные записи на основе информации об отдельных записях. Если updateTransform() завершится ошибкой, весь граф завершится ошибкой.

Пример
function updateTransform(counter,out_rlp) {
  if(counter > 0) return SKIP;

  $out[0].field = $in[0].field;
  $out[0].num = $in[0].num;

  return ALL;
}

Когда группа закончилась, отрабатывает finishGroup(groupAccumulatorMetadataId).

ПараметрЗначение
ОбязательныйДа
Входные параметры
<metadata name> groupAccumulatorMetadataId

Метаданные, указанные пользователем. Если groupAccumulatorMetadataId не определен, выполнение графа завершится с ошибкой.

Возвращает

если true, то вызывается transform(counter, groupAccumulatorMetadataId)

если false, то граф завершится с ошибкой.

Вызов

Вызывается повторно, один раз для последней входной записи каждой группы. Вызывается после того, как updateGroup(groupAccumulatorMetadataId) уже был вызван для всех входных записей группы.

Описание

Если finishGroup() завершается с ошибкой, то весь граф завершится ошибкой.

Пример
function finishGroup(out_rlp) {
    return true;
}

Затем выполняется transform(counter, groupAccumulatorMetadataId).

ПараметрЗначение
ОбязательныйДа
Входные параметры

целочисленный счетчик (начинается с 0, указывает количество созданных записей. должен быть завершен, как показано в примере ниже. Вызовы функций заканчиваются, когда возвращается SKIP.)

<metadata name> groupAccumulatorMetadataId (метаданные, указанные пользователем).

Если groupAccumulatorMetadataId не определен, выполнение графа завершится с ошибкой.

Возвращаетцелочисленные значения
Вызов

Вызывается неоднократно, как указано пользователем. Вызывается после того, как updateGroup(groupAccumulatorMetadataId) возвращает значение true. Функция вызывается до тех пор, пока не будет возвращен SKIP.

Описание

Создает выходные записи на основе всех записей всей группы. Если функция transform() завершается ошибкой, то весь граф завершится с ошибкой.

Пример
function transform(counter,out_rlp) {
  if(counter > 0) return SKIP;

Входные записи или поля

Входные записи или поля доступны в функциях initGroup(), updateGroup(), finishGroup(), updateTransform(), transform().

Выходные записи или поля

Выходные записи или поля доступны в функциях updateTransform(), transform().

Групповой аккумулятор

Групповой аккумулятор доступен в функциях initGroup(), updateGroup(), finishGroup(), updateTransform(), transform().

Пример. Сгруппировать записи.

На вход в ROLLUP подаются записи, некоторые из которых имеют одинаковое значение поля "num". Нужно соединить значения всех полей, у которых одинаковое значение num и подать на выходной порт.

  1. Создать метаданные.

rollin:

  • stra (string),
  • num (integer),
  • stro (string),
  1. Поместить компоненты на рабочую область.
  2. Соединить шаги ребрами и назначить им метаданные.
  3. Задать значения атрибутов шагу 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;
}
  1. Результатом выполнения графа будут строки из входных записей, значения полей которых соединенны при условии наличия одинакового значения поля "num".