Я внедряю Data Mart, следуя методологии Kimball, и у меня есть проблема с применением дельт из нескольких исходных таблиц к одному целевому измерению.
Вот пример входных данных источника:
STG_APPLICATION
APP_ID, APP_NAME, APP_START_DATE, CDC_HASH, ...
1, FOOBAR, 20/10/2018, MD5_XXX
STG_APPLICATION_STATUS
APP_ID, STATUS_CODE, STATUS_DESC, CDC_HASH, ...
1, SUBMITTED, "APP WAS SUBMITTED", MD5_YYY
Каждая из этих таблиц (есть несколько других) представляет собой нормализованную версию исходных данных, т. Е. С одним приложением может быть связано одно или несколько состояний.
Теперь, поскольку мы получаем только полную альфа для этих таблиц, мы должны выполнить слияние моментальных снимков, то есть применить полное внешнее объединение к набору записей текущего дня с набором записей предыдущего дня для каждой отдельной таблицы. Это вычисляется путем сравнения CDC_HASH (конкат всех исходных столбцов). Результат этого сравнения сохраняется в дельта-таблице следующим образом:
STG_APPLICATION_DELTA
APP_ID, APP_NAME, APP_START_DATE, CDC_HASH, CDC_STATUS ...
STG_APPLICATION_STATUS
APP_ID, STATUS_CODE, STATUS_DESC, CDC_HASH, CDC_STATUS...
1, AWARDED, "APP WAS AWARDED", MD5_YYY, NEW
Таким образом, в этом примере первая таблица, STG_APPLICATION, не создавала дельта-запись, поскольку атрибуты, относящиеся к этой таблице, не менялись между ежедневными нагрузками. Однако связанная таблица, STG_APPLICATION_STATUS, рассчитала дельту, то есть одно или несколько полей изменились с момента последней загрузки. Это подчеркивается CDC_STATUS, который определяет его как новую запись для вставки.
Проблема сейчас, конечно, состоит в том, как правильно обрабатывать эту ситуацию при загрузке целевого измерения? Например:
DIM_APPLICATION
ID, APPLICATION_ID, APP_NAME, APP_START_DATE, APP_STATUS_CODE, FROM_DATE, TO_DATE
1, 1, FOOBAR, 20/10/2018, SUBMITTED, 20/10/2018, 12/04/2019
2, 1, NULL, NULL, NULL, AWARDED, 13/04/2019, 99/99/9999
Здесь показана первая запись, основанная на соединении этих двух промежуточных таблиц, и вторая запись, которая должна отражать обновленную версию записи. Однако, как показано выше, мои таблицы Delta заполнены только частично, и поэтому я не могу корректно обновить измерение, как показано здесь.
Логически я понимаю, что мне нужно иметь возможность включать все поля, которые используются измерением, как часть моего вычисления дельты, чтобы при обновлении измерения у меня была копия полной записи, но я не уверен, что лучший способ реализовать это в моей области подготовки. Как уже показано, в настоящее время у меня есть только независимые промежуточные таблицы, каждая из которых рассчитывает свою дельту отдельно.
Пожалуйста, кто-нибудь может посоветовать лучший способ справиться с этим? Я изучил книги Кимбалла по этому вопросу, но безрезультатно. И я также не нашел подходящего ответа ни на одном онлайн-форуме. Это распространенная проблема, поэтому я уверен, что существует подходящий архитектурный шаблон для решения этой проблемы.