DBJOIN
DBJOIN получает данные через один входной порт и объединяет их с данными из таблицы базы данных. Эти два источника данных могут иметь разную структуру метаданных.
Не требует сортировки входных данных и работает очень быстро, поскольку данные обрабатываются в памяти.
После объединения данные отправляются на первый выходной порт. Второй выходной порт может использоваться для вывода несовпадающих по ключу записей из основного потока.
Поток передающий данные через первый входной порт, называются основным, а поток данных из базы называется подчинённым. Его данные считаются поступившими через виртуальный входной порт. Каждая основная запись сопоставляется с подчинённой записью по одному или нескольким полям, называемым ключом соединения.
Выходные данные создаются путем применения преобразования, которое сопоставляет объединенные входные данные с выходными.
Порты DBJOIN:
Тип порта | Номер | Обязательный | Описание | Метаданные |
---|---|---|---|---|
Input | 0 | да | Главный входной порт | Любые |
1 (виртуальный) | да | Подчинённый входной порт | ||
Output | 0 | да | Выходной порт для объединенных данных | |
1 | нет | Выходной порт для необъединённых данных | Как на Input 0 |
Атрибуты DBJOIN:
Атрибут | Обязательный | Описание | Возможные значения |
---|---|---|---|
joinKey | да | Ключ, по которому объединяются входящие потоки данных. Если полей ключа несколько - они должны быть записаны через точку с запятой. Перед именем поля должен стоять знак доллара `$`. |
|
joinType | нет | Тип объединения. Бывает "inner"(по умолчанию) и "leftOuter" | joinType="leftOuter" |
dbConnection | да | Идентификатор соединения с БД, который будет использоваться в качестве ресурса подчинённых записей. | conn0 |
sqlQuery | да | SQL-запрос. В условии WHERE нужно использовать плейсхолдер '?' для подстановки значения ключа (если ключ составной, используйте плейсхолдер для каждого поля в WHERE). |
|
url | да | Имя внешнего файла, включая путь, содержащий SQL-запрос. |
|
transform | да | Функция преобразования |
|
cacheSize | Максимальное количество записей с разными значениями ключей, которые можно сохранить в памяти. |
| |
charset | Кодировка файла, в котором хранится алгоритм преобразования. |
|
Ключ соединения
Ключ соединения — это последовательность имен полей из основного источника данных, отделенных друг от друга точкой с запятой. Ключ можно определить в редакторе шага. Порядок имен полей должен соответствовать порядку ключевых полей таблицы базы данных (и их типам данных). Подчинённая часть ключа соединения должна быть определена в атрибуте sqlQuery
.
$first_name;$last_name
Это поля, которые служат для объединения основных записей с подчинёнными записями. SQL-запрос должен содержать выражение, которое может выглядеть следующим образом:
... where fname=? and lname=?
Значение first_name
будет подставлено на место первого знака вопроса в этом условии, а last_name
- на место второго. Сначала будет произведён поиск совпадений по joinKey
в кеш-памяти, если подходящих записей не обнаружится, то данные будут запрошены из базы данных, иначе - найденная запись сразу отправится для преобразования в функцию transform
.
Преобразование
Преобразование в DBJOIN позволяет определить способ сопоставления данных, с помощью которого записи буду отправлены на первый выходной порт. Несоединенные записи из основного потока, отправляемые на второй выходной порт, не могут быть изменены в рамках преобразования DBJOIN.
Заметка: Если преобразование указано во внешнем файле, рекомендуется явно указать кодировку файла в артибуте
charset
.
Заметка:
- при получении более одной записи из базы в лог будет выведено предупреждение "read more than one record".
- при автоматическом увеличении рамера кеша для обработки данных - "riched cache size".
Пример. Соединение записей из двух источников.
- Объединим записи из двух баз. Используем DB_READER для чтения из базы postgres и DBJOIN для чтения из firebird и объединения потоков по ключу.
Запрос для DB_READER:
sqlQuery = "select bigintcolumn, booleancolumn, charcolumn, smallintcolumn, textcolumn from onebridge."million_row" order by bigintcolumn limit 100"
Атрибуты для DBJOIN:
sqlQuery = "select FIRST 100 bigintcolumn, booleancolumn, charcolumn, smallintcolumn, textcolumn from MILLION_ROW WHERE bigintcolumn = ?"
Объединённые данные можно вывести на первый выходной порт DBJOIN, а не обьединенные данные с главного входного порта - на второй порт.