Операция ETL — возврат первичного ключа
-
22-09-2019 - |
Вопрос
Я использую Talend для заполнения хранилища данных.Моя работа — записывать данные о клиентах в таблицу измерений, а данные о транзакциях — в таблицу фактов.Суррогатный ключ (p_key) в таблице фактов автоматически увеличивается.Когда я добавляю нового клиента, мне нужна таблица фактов, чтобы отразить идентификатор соответствующего клиента.
Как я уже упоминал, мой p_key имеет автоматическое автоматическое приращение, поэтому я не могу просто вставить произвольное значение для p_key.
Есть какие-нибудь мысли о том, как я могу вставить строку в свою таблицу измерений и при этом получить первичный ключ для ссылки в моей записи фактов?
Больше информации:
Что делать, если входящие данные не нормализованы?Например, у меня есть CSV со следующими данными:
order # date total customer# first_name last_name
111 1/2/2010 500 101 John Smith
222 1/3/2010 600 101 John Smith
Очевидно, я хочу, чтобы информация о клиенте отображалась в таблице измерений, а данные о транзакциях — в таблице фактов:
dimension
101 john smith
fact
111 1/3/2010
222 1/3/2010
Как вы упомянули, ключ таблицы измерений будет автоматически увеличиваться.Таблица фактов должна ссылаться на этот ключ.Как спроектировать задание etl так, чтобы суррогатный ключ возвращался после вставки в ?
Кроме того, если данные клиента дедуплицируются (как указано выше), как вы обрабатываете ключи?
Решение
Однако я, возможно, неправильно понял вашу проблему:
Таблица фактов может иметь или не иметь автоматически увеличивающийся PK, обычно PK в таблице фактов представляет собой совокупность нескольких FK, ссылающихся на таблицы измерений.
Таблица измерений должна иметь автоматически увеличивающийся ПК.
Новый клиент должен «попасть» в таблицу измерений клиентов до того, как факт транзакции достигнет хранилища данных (или, по крайней мере, таблицы фактов).
Таблица измерений должна иметь BusinessKey, который однозначно идентифицирует клиента, например адрес электронной почты, полное имя + PIN-код или что-то подобное.
Строка входящей транзакции также должна содержать поле BusinessKey клиента — именно так мы идентифицируем клиента.
Используйте BusinessKey для поиска PrimaryKey клиента в таблице измерений клиентов перед вставкой транзакции в таблицу фактов.
РЕДАКТИРОВАТЬ
Если ваши новые данные о клиенте включены в транзакцию, найдите способ извлечь данные о клиентах и направить их в хранилище данных перед транзакцией.
ОБНОВЛЯТЬ:
Сначала загрузите dimCustomer, выберите BusinessKey, чтобы измерение выглядело так:
CustomerKey = 12345 (auto-incremented)
CustomerBusinessKey = john_smith_101 (must uniquely identify the John Smith)
CustomerFirstName = John
CustomerLastName = Smith
В процессе загрузки измерений вам необходимо разделить входящие строки на два потока: существующих и новых клиентов.Строки из потока «существующий клиент» обновляют таблицу dim (SCD типа 1), а строки из потока «новый клиент» вставляются.В потоке вставляемых строк не должно быть дубликатов;это можно сделать, вставив их в промежуточную таблицу и удалив там дубликаты непосредственно перед окончательной вставкой в таблицу измерений.Вы также можете извлечь дубликаты и направить их обратно в процесс загрузки для обновления записей о клиентах;они могут содержать более новые данные, например обновленные номера телефонов и т.п.
Как только клиент приедет, загрузите факты.
Таблица фактов должна выглядеть примерно так:
DateKey (PK)
CustomerKey
OrderNumber (PK)
Total
Я использовал составной первичный ключ DateKey и OrderNumber, что позволяет время от времени сбрасывать последовательность номеров заказов.
В процессе загрузки измените запись факта, чтобы она выглядела примерно так:
DateKey CustomerBusinessKey OrderNumber Total
20100201 john_smith_101 111 500
20100301 john_smith_101 222 600
На этом этапе нам нужно заменить CustomerBusinessKey на CustomerKey из таблицы измерений с помощью поиска.Итак, после поиска поток будет выглядеть так:
DateKey CustomerKey OrderNumber Total
20100201 12345 111 500
20100301 12345 222 600
Теперь это можно вставить в таблицу фактов.
Я также немного схитрил — не искал ключ даты в dimDate и не искал существующие строки в таблице фактов.При загрузке таблицы фактов вы можете поискать существующую комбинацию (DateKey, OrderNumer) перед загрузкой или оставить ее на усмотрение первичного ключа для защиты от дубликатов — на ваш выбор.В любом случае убедитесь, что попытка повторно загрузить те же данные в таблицу фактов не удалась.