Трансформация данных
Трансформация — это преобразование данных с помощью особой функции-трансформера. Такие функции выполняются на потоке данных, применяются к каждому элементу изменений данных (data change item) и преобразуют их. Трансформер может работать и на уровне мета-информации, и на уровне самих данных.
Трансформацию данных можно настроить во время создания или изменения трансфера.
Трансформация данных доступна, только если источник и приемник имеют разные типы.
Трансформеры задаются списком. При активации трансфера для подходящих под заданные условия таблиц составляется план трансформации. Трансформеры будут применяться к таблицам в том порядке, в котором они перечислены в списке.
Типы трансформеров
Некоторые трансформеры могут иметь ограничения и применимы не для всех типов пар источник-приемник. Список трансформеров будет пополняться. В настоящий момент доступны следующие типы:
- Переименование таблиц
- Фильтр колонок
- Маскирование данных
- Разделение на подтаблицы
- Замена первичных ключей
- Преобразование значений колонок в строки
- Шардирование
- Фильтр строк для APPEND-ONLY источников
Переименование таблиц
Вы можете задать правила переименования таблиц, указав существующие имена таблиц в источнике и новые имена для этих таблиц в приемнике.
Фильтр колонок
Вы можете настроить список столбцов таблиц для переноса:
- С помощью списков включенных и исключенных таблиц задайте перечень таблиц, к которым будет применен фильтр.
- С помощью списков включенных и исключенных колонок задайте перечень столбцов, которые должны перенестись в таблицы приемника.
Маскирование данных
Вы можете захешировать данные:
- С помощью списков включенных и исключенных таблиц задайте перечень таблиц, в которых будут маскироваться данные.
- Укажите имя колонки для маскирования (регулярное выражение). Для каждой колонки укажите соль (строка типа пароль). Эта строка будет использована в функции
HMAC(sha256, salt), применяемой к данным в колонке.
Разделение на подтаблицы
Трансфер разбивает таблицу X на несколько других X_1, X_2, …, X_n по данным. Если до разбиения строка находилась в таблице X, теперь она находится в таблице X_i, где i определяется следующими параметрами: список колонок и строка разбиения.
Пример:
Если в списке колонок указаны две колонкимесяц рожденияипол, а в строке разбиения указано@, то информация о сотруднике Иване, родившемся 11 февраля 1984 года, из таблицыСотрудникипопадет в таблицуСотрудники@февраль@мужской— это новое имя таблицы.
Для разбиения таблиц:
- С помощью списков включенных и исключенных таблиц задайте перечень таблиц.
- Укажите колонки в таблицах для разбиения.
- Укажите строку разбиения, которая будет соединять составляющие в новом имени таблицы.
Замена первичных ключей
Для переопределения первичных ключей задайте список включенных и исключенных таблиц и список колонок, используемых в качестве первичного ключа.
Преобразование значений колонок в строки
Для преобразования значений колонок в строковые значения задайте список включенных и исключенных таблиц и список колонок. Значения будут преобразованы в зависимости от исходного типа:
| Исходный тип | Формат |
|---|---|
| Any | Сериализованный формат JSON |
| Date | Строка вида 2006-01-02 |
| DateTime | Строка вида 2006-01-02T15:04:05.999999999Z07:00 |
Шардирование
Шардирование используется при поставке данных в очереди, прежде всего для поставки в Yandex Data Streams, поскольку в Data Streams пропускная способность ограничена и распределение данных по шардам повышает производительность трансфера.
Поддерживаются два типа шардирования:
- Список колонок (шардирование по колонкам) — строки с одинаковыми значениями в указанных колонках попадают в один шард.
- Случайное шардирование — строки распределяются по шардам случайным образом. Для распределения используется случайный UUID
, который генерируется заново при перезапуске Data Plane. Если изменить количество шардов, данные перераспределятся за счет генерации нового UUID.
Рекомендуется задавать количество шардов так, чтобы их было в 3–10 раз больше, чем партиций в приемнике. Так данные распределятся по партициям более равномерно.
Особенности работы при поставке в Data Streams
Если используется шардирование по колонкам, воркер может быть только один. Это связано с тем, что для поставки в Data Streams трансформер формирует идентификатор источника данных — source_id. Разные воркеры создают одинаковые source_id, а Data Streams не допускает существования нескольких одинаковых source_id на запись.
Фильтр строк для APPEND-ONLY источников
Этот фильтр применим только к трансферам, в которых в качестве источника данных используются очереди (например, Apache Kafka®). При выполнении трансфера в потоке изменений остаются только те строки, которые удовлетворяют заданным критериям.
- С помощью списков включенных и исключенных таблиц задайте перечень таблиц, в которых будут фильтроваться данные.
- Задайте критерий для фильтрации. В качестве критерия можно задавать операции сравнения числовых, строковых и булевых значений и сравнение с NULL, а также проверку, входит ли подстрока в строку и принадлежит ли значение множеству.
Критерий фильтрации задается набором правил, разделенных ключевым словом AND. Допустимы операции >, >=, <, <=, =, !=, ~ (подстрока входит в строку), !~ (подстрока не входит в строку), IN (значение принадлежит множеству), NOT IN (значение не принадлежит множеству). Все колонки, указанные в фильтре, должны быть представлены в фильтруемой таблице.
Пример строки-фильтра:
aid > 0 AND id >= 10 AND f > 1000.1 AND f <= 1000.5 AND d != 3.14 AND i < 0 AND bi >= -9223372036854775808 AND biu <= 9223372036854775807 AND da > 1999-01-04 AND da <= 2000-03-04 AND ts > 2000-01-01T00:00:00 AND c != 'a' AND str ~ 'hello' AND t !~ 'bye-bye' AND nil = NULL AND val != NULL
Для фильтра поддерживается единственный уровень вложенности (скобки) и только с операторами IN и NOT IN.
Пример строки-фильтра с использованием операторов IN и NOT IN:
i IN (3, 5, 7) AND str IN ('hello', 'hi') AND c NOT IN ('a', 'b', 'c')
Особенности работы фильтра:
-
Если тип значения, указанного для колонки в фильтре, не совпадает с типом этой колонки в фильтруемой таблице, то трансформер не применяется (строки не фильтруются).
-
Если в фильтре указана строковая колонка, то тип этой колонки в фильтруемой таблице должен быть
UTF8для источников, где парсер явно указывает типы колонок (например, для YDS). Колонки типаSTRINGтрансформером не поддерживаются (строки не фильтруются).
Вы можете указывать сразу несколько критериев-фильтров. При указании нескольких критериев данные будут транспортироваться, если они удовлетворяют хотя бы одному из фильтров (аналог операции OR).