AGGREGATE
Получает записи через один входной порт, вычисляет статистическую информацию о записях входных данных и отправляет их на все выходные порты. Требует сортировки входных записей.
Порты AGGREGATE:
Тип порта | Номер | Обязательный | Описание | Метаданные |
---|---|---|---|---|
Input | 0 | да | Для входных записей | Любые |
Output | 0-n | да | Для результатов подсчетов | Любые |
Атрибуты AGGREGATE:
Атрибут | Обязательный | Описание | Возможные значения |
---|---|---|---|
aggregateKey | нет | Ключ, по которому группируются записи | key1;key2 |
mapping | да | Определяет способ присвоениея входных данных к полям выходных метаданных. Выражения внутри маппинга разделяются точкой с запятой (;), перед именем поля метадаты нужно ставить доллар ($), для присвоения использовать двоеточие и равно (:=). | $field1:=$field1;$res:=count(field2);$srznach:=avg($field3) |
zeroCount | нет | Определяет обработку отсутствия данных для определенного в артибуте aggregateKey ключа. При zeroCount=true, в случае отсутствия записей на входе в ноду, генерируется 1 запись на выход. Если установлено значение false, ни одна запись не создается. | false (по умолчанию)/true |
Функции AGGREGATE:
Функция | Описание | Тип входных данных | Тип выходных данных |
---|---|---|---|
avg | Возвращает среднее арифметическое. | любой числовой тип | number |
count | Подсчитывает количество строк, учитывает null. | любой | number |
countnotnull | Подсчитывает записи, если поле содержит null, оно не учитывается. | любой | number |
countunique | Подсчитывает уникальные значения. Считает null уникальным значением. | любой | number |
first | Возвращает первое значение группы. | любой | любой |
firstnotnull | Возвращает первое значение, отличное от null. | любой | любой |
last | Возвращает последнее значение группы. | любой | любой |
lastnotnull | Возвращает последнее значение, отличное от null. | любой | любой |
max | Возвращает максимальное значение. | любой числовой тип | любой числовой тип |
md5 | любой | string | |
median | Возвращает медианное значение. null значения не учитываются. | любой числовой тип | number |
min | Возвращает минимальное значение. | любой числовой тип | любой числовой тип, соответствующий входному |
modus | Возвращает наиболее часто используемое значение (null-значения не учитываются). Если кандидатов больше, возвращается первый. | тип | тип |
sum | Возвращает сумму входных значений. | любой числовой тип | number |
const | любой | string |
Пример. Вызов функций avg, count, max, last и sum через шаг AGGREGATE
<Graph>
<Global>
<Metadata id="meta0">
<Record name="inMeta" type="delimited" recordDelimiter="\n" fieldDelimiter=",">
<Field name="key1" type="integer"/>
<Field name="key2" type="integer"/>
<Field name="field1" type="number"/>
<Field name="field2" type="number"/>
<Field name="field3" type="number"/>
</Record>
</Metadata>
<Metadata id="meta1">
<Record name="outMeta" type="delimited" recordDelimiter="\n" fieldDelimiter=",">
<Field name="avg" type="number"/>
<Field name="count" type="number"/>
<Field name="countnotnull" type="number"/>
<Field name="countunique" type="number"/>
<Field name="first" type="integer"/>
<Field name="firstnotnull" type="number"/>
<Field name="last" type="number"/>
<Field name="lastnotnull" type="number"/>
<Field name="max" type="number"/>
<Field name="md5" type="string"/>
<Field name="median" type="number"/>
<Field name="min" type="number"/>
<Field name="modus" type="number"/>
<Field name="sum" type="number"/>
<Field name="const" type="string"/>
</Record>
</Metadata>
</Global>
<Phase number="0">
<Node id="DataGenerator0" guiX="100" guiY="50" guiName="DataGenerator" type="DATA_GENERATOR" recordsNumber="20">
<attr name="generate"><![CDATA[// Generates output record.
function generate() {
$out[0].key1 = Math.floor(Math.random() * 10);
$out[0].key2 = Math.floor(Math.random() * 10);
$out[0].field1 = Math.floor(Math.random() * 1000);
$out[0].field2 = Math.floor(Math.random() * 1000);
$out[0].field3 = Math.floor(Math.random() * 1000);
return ALL;
}]]></attr>
</Node>
<Node id="Sort0" guiX="300" guiY="50" guiName="Sort" type="EXT_SORT" sortKey="key1;key2">
</Node>
<Node id="FlatFileWriter0" guiX="700" guiY="50" guiName="FlatFileWriter0" type="FLAT_FILE_WRITER" fileURL="aggregate.csv" />
<Edge id="Edge0" fromNode="DataGenerator0:0" toNode="Sort0:0" metadata="meta0"/>
<Edge id="Edge2" fromNode="Sort0:0" toNode="FlatFileWriter0:0" metadata="meta0"/>
<Edge id="Edge1" fromNode="Sort0:1" toNode="Aggregate0:0" metadata="meta0"/>
</Phase>
<Phase number="1">
<Node id="Aggregate0" guiX="500" guiY="150" guiName="Aggregate" aggregateKey="city" zeroCount="true" mapping="$avg:=avg($key1);$count:=count($key1);$countnotnull:=countnotnull($key2);$countunique:=countunique($key2);$first:=first($key1);$firstnotnull:=firstnotnull($field2);$last:=last($field2);$lastnotnull:=lastnotnull($field2)" type="AGGREGATE">
</Node>
<Edge id="Edge3" fromNode="Aggregate0:0" toNode="FlatFileWriter1:0" metadata="meta1"/>
<Node id="FlatFileWriter1" guiX="700" guiY="150" guiName="FlatFileWriter0" type="FLAT_FILE_WRITER" fileURL="agg.csv" />
</Phase>
</Graph>