HASH_JOIN
HASH_JOIN объединяет потоки данных по ключу.
Этот шаг получает данные через два или более входных порта, каждый из которых может иметь различную структуру метаданных. Записи не обязательно сортировать перед передачей в этот шаг.
Сначала HASH_JOIN считывает записи из всех подчинённых портов и сохраняет их в хэш-таблицы.
Для каждого подчинённого порта создается отдельная хэш-таблица. Размер всех созданных хэш-таблиц не должен превышать размер оперативной памяти сервера, так как хэш-таблицы хранятся в оперативной памяти и ее переполнение приведет к завершению задания с ошибкой. Поэтому имеет смысл в главный входной поток подавать большое количество записей, а в подчинённые потоки – небольшие группы записей.
Затем для каждой записи из мастера производится поиск совпадения с записями из каждой хэш-таблицы по заданному ключу соединения.
Если совпадение найдено, кортеж из записи главного порта и хэш-таблицы подчинённого порта трансформируется заданным образом. Полученная после преобразования запись подаётся на первый выходной порт. Метод преобразования вызывается для каждого кортежа главной и соответствующих подчинённых записей. Записи из главного порта, которые не были объединены подаются на второй выходной порт.
Порты HASH_JOIN:
Тип порта | Номер | Обязательный | Описание | Метаданные |
---|---|---|---|---|
Input | 0 | да | Главный входной порт | Любые |
1 | да | Дополнительный входной порт | ||
2-n | нет | Опциональные дополнительные входные порты | ||
Output | 0 | да | Исходящий порт | |
1 | нет | Порт для записей, которые не подошли по ключу соединения | Как у Input 0 |
Атрибуты HASH_JOIN:
Атрибут | Обязательный | Описание | Возможные значения |
---|---|---|---|
joinKey | да | Ключ, по которому объединяются входящие потоки данных. Порты отделяются друг от друга хешем #. Сопоставление полей одного порта отделяются друг от друга точкой с запятой ';'. Перед именем каждого поля нужен знак '$'. |
|
joinType | нет | Тип объединения. Бывает "inner"(по умолчанию) и "leftOuter" | joinType="leftOuter" |
transform | да |
Преобразование, определенное в файле задания на внутреннем языке системы |
|
slaveDuplicates | нет | Если установлено значение true, разрешены записи с повторяющимися значениями ключей. Если false, для объединения используется только последняя запись. По умолчанию true. | slaveDuplicates="false" |
Пример.
Даны два потока записей. В одном потоке содержится информация о названии продукта в поле «Product» и его цвете на русском языке «rus_color», во втором потоке – названию цвета на русском языке соответствует название на английском «eng_color». Задача сопоставить продукт и его цвет на английском языке.
порт0:
product | rus_color |
---|---|
шарф | красный |
носок | белый |
свитер | зеленый |
порт1:
rus_color | eng_color |
---|---|
синий | blue |
желтый | yellow |
красный | red |
Ключ соединения: joinKey="$rus_color"
Формула для объединения:
<Attr name="transform">
<![CDATA[
function transform() {
//transform code
$out[0].product = $in[0].product;
$out[0].eng_color = $in[1].eng_color;
return ALL;
}
]]></Attr>
Исходящие записи:
порт0:
product | eng_color |
---|---|
шарф | red |
порт1:
product | rus_color |
---|---|
носок | белый |
свитер | зеленый |