AGGREGATE

Получает записи через один входной порт, вычисляет статистическую информацию о записях входных данных и отправляет их на все выходные порты. Требует сортировки входных записей.

Порты AGGREGATE:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даДля входных записейЛюбые
Output0-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>