Изменение сбора данных с объединением таблиц в ETL
В моем процессе ETL я использую Change Data Capture (CDC) для обнаружения только тех строк, которые были изменены в исходных таблицах с момента последнего извлечения. Тогда я делаю преобразование только для этой строки. Проблема в том, что у меня есть, например, 2 таблицы, которые я хочу объединить в одном измерении, и только одна из них изменилась. Например, у меня есть таблица "Страны и города":
Страны:
ID Name
1 France
Города:
ID Name Country_ID
1 Lyon 1
Теперь допустим, что в таблицу Towns добавлена новая строка:
ID Name Country_ID
1 Lyon 1
2 Paris 2
Таблица стран не была изменена, поэтому CDC для этих таблиц показывает мне только строку из таблицы городов. Проблема заключается в том, что когда я выполняю объединение стран и городов, в наборе изменений стран нет строки, поэтому объединение приведет к пустому набору.
У вас есть идея, как это решить? Конечно, могут быть более сложные случаи, включающие 3 и более таблиц и последующие объединения.
2 ответа
Это типичная проблема, возникающая при выполнении захвата данных изменений в реальном времени или даже ежедневных изменений только для добавочных значений.
Есть несколько способов решить эту проблему.
Одним из способов было бы сделать ваши объединения по естественным ключам в таблице измерений или сопоставления, чтобы получить связанную страну (ВЫБЕРИТЕ отдельное название страны, [..другие атрибуты..] из dim_table где country_id = X).
Другой альтернативой было бы сделать объединение как часть процесса захвата изменений - когда строка загружается в города, срабатывает триггер, который загружает значения внешнего ключа в связанные промежуточные таблицы (страна и т. Д.).
Я могу поболтать за дополнительной информацией, но я буду конкретен с тем, что есть в вашем вопросе. Я бы предложил следующее, чтобы получить результаты...
1st Pass is where everything matches via the join...
Union All
2nd Pass Gets all towns where there isn't a country
(left outer join with a where condition that
requires the ID in the countries table to be null/missing).
Вы бы использовали значение идентификатора страны по умолчанию в этом несопоставленном соединении с чем-то, обозначенным как "Несоответствующее значение", обычно 0 или -1, или рядом стандартных отрицательных чисел, которым вы могли бы назначить описания позже, чтобы определить, почему данные плохи для вашего Примером -1 может быть "Найденный город без страны".