Стратегия CDC для нескольких промежуточных столов - PullRequest
0 голосов
/ 12 апреля 2019

Я внедряю 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 заполнены только частично, и поэтому я не могу корректно обновить измерение, как показано здесь.

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

Пожалуйста, кто-нибудь может посоветовать лучший способ справиться с этим? Я изучил книги Кимбалла по этому вопросу, но безрезультатно. И я также не нашел подходящего ответа ни на одном онлайн-форуме. Это распространенная проблема, поэтому я уверен, что существует подходящий архитектурный шаблон для решения этой проблемы.

1 Ответ

0 голосов
/ 12 апреля 2019

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

Если количество (неизменных) данных не является чрезмерным, вы можете объединить полные снимки STG_APPLICATION и STG_APPLICATION_STATUS вместе в APP_ID, пока они не будут напоминать запись по измерениям по столбцам, и сохранить их в отдельной таблице со своим хэшем CDC для использования. как и в предыдущий день. Затем вы берете дельты на этом уровне и отправляете (завершенные) измененные записи как обновления измерения.

Если из-за количества записей в ежедневном обновлении нецелесообразно объединять полные таблицы, вы можете использовать дельты и полное внешнее объединение, как и сейчас. Затем вы просматриваете текущую запись измерения для этого APP_ID и заполняете все пустые поля в дельта-записи. Законченная запись затем отправляется как обновление измерения. Это решение требует меньше места для хранения, но выглядит более хрупким, особенно если в течение дня возможно несколько изменений. Если есть много изменений, производительность также может пострадать. Для небольшого количества изменений в миллионах записей он должен быть более эффективным.

...