DBJOIN

DBJOIN icon

DBJOIN получает данные через один входной порт и объединяет их с данными из таблицы базы данных. Эти два источника данных могут иметь разную структуру метаданных.

Шаг DBJOIN не требует сортировки входных данных и работает очень быстро, поскольку данные обрабатываются в памяти.

После объединения к данным применяется преобразование и результат отправляется на первый выходной порт. Второй выходной порт может использоваться для вывода несовпадающих по ключу записей из основного потока.

Поток, передающий данные через первый входной порт, называется основным, а поток данных из базы называется подчинённым. Его данные считаются поступившими через виртуальный входной порт. Каждая основная запись сопоставляется с подчинённой записью по одному или нескольким полям, называемым ключом соединения.

Порты DBJOIN:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0даГлавный входной портЛюбые
1 (виртуальный)даПодчинённый входной порт
Output0даВыходной порт для объединенных данных
1нетВыходной порт для необъединённых данныхКак на Input 0

Атрибуты DBJOIN:

АтрибутОбязательныйОписаниеВозможные значения
joinKeyдаКлюч, по которому объединяются входящие потоки данных. Если полей ключа несколько - они должны быть записаны через точку с запятой. Перед именем поля должен стоять знак доллара `$`.

$schemaName;$tableName

joinTypeнетТип объединения. Бывает "inner"(по умолчанию) и "leftOuter"joinType="leftOuter"
dbConnectionдаИдентификатор соединения с БД, который будет использоваться в качестве ресурса подчинённых записей.conn0
sqlQueryдаSQL-запрос. В условии WHERE нужно использовать плейсхолдер '?' для подстановки значения ключа (если ключ составной, используйте плейсхолдер для каждого поля в WHERE).

        select c.ordinal_position
        from information_schema.tables t
            join information_schema.columns c on c.table_name=t.table_name
                                              and c.table_schema=t.table_schema
        where lower(t.table_schema)=lower(?)
            and lower(t.table_name)=lower(?)
            and lower(c.column_name)=lower(?)

urlдаИмя внешнего файла, включая путь, содержащий SQL-запрос.

url="${QUERY_DIR}"

transformдаФункция преобразования
function transform() {
    $out[0].customer_id = $in[0].person_number;
    $out[1].customer = $in[0].person_name;
return ALL;
}

cacheSizeМаксимальное количество записей с разными значениями ключей, которые можно сохранить в памяти.

cacheSize="100" по умолчанию

charsetКодировка файла, в котором хранится алгоритм преобразования.

charset="UTF-8" по умолчанию

Ключ соединения

Ключ соединения — это последовательность имен полей из основного источника данных, отделенных друг от друга точкой с запятой. Ключ можно определить в редакторе шага. Порядок имен полей должен соответствовать порядку ключевых полей таблицы базы данных (и их типам данных). Подчинённая часть ключа соединения должна быть определена в атрибуте 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".

Пример. Соединение записей из двух источников.

  1. Объединим записи из двух баз. Используем 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, а не обьединенные данные с главного входного порта - на второй порт.