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"
Код трансформации для объединения:
function transform() {
$out[0].product = $in[0].product;
$out[0].eng_color = $in[1].eng_color;
return ALL;
}
Исходящие записи:
порт0:
| product | eng_color |
|---|---|
| шарф | red |
порт1:
| product | rus_color |
|---|---|
| носок | белый |
| свитер | зеленый |