Обновить

Повышаем эффективность хранения данных до 300 раз с помощью таблиц SCD-2

Уровень сложностиПростой
Время на прочтение14 мин
Охват и читатели8.5K
Всего голосов 7: ↑6 и ↓1+5
Комментарии9

Комментарии 9

Наверное, вот почему сервера Пятерочки раньше хранили историю покупок "пожизненно", а теперь 4 месяца.

Данные о покупках - это, как раз, пример данных, которые не нужно пытаться складывать в таблицы с типом SCD-2. От этого не будет никакой пользы. Поэтому мы так их не храним.

В первой таблице напутаны как раз даты валидности записей для Галины.

Спасибо за вашу обратную связь и, что обратили внимание на этот важный момент.

В таблице с примером про Степана и Галину всё верно. Так и задумано, что 2025-03-10 была добавлена запись о том, что запись о Галине была удалена 2025-03-09. Мы это обнаружили при очередной сверке среза за 2025-03-10 со срезом за 2025-03-09, которую мы делали 2025-03-10. Таким образом, мы понимаем, что история взаимодействия с Галиной завершилась 2025-03-09.

Это важно учитывать при построении среза на заданную дату. У меня в примере функции и запроса для получения среза даты начала и окончания включены в диапазон (поэтому там используются операторы >= и <=).

Понял, спасибо за объяснение

Вы добавили таблице темпоральность вместо того, что бы хранить снимки данных на каждый день так, что ли? Что за очередной велосипед? Последнее время появилась куча людей, которая с опытом в три года не зная теории изображает из себя архитекторов. Жесть.

Интересно, а что бы вы предложили для этой задачи по уменьшению объема накопленных исторических данных в виде срезов (снимков) для того же окружения (Hadoop и PySpark)?
При этом нужно сохранить всю историю изменений и вы не можете быстро перейти на какую-то другую новую платформу/технологию из-за различных технических и организационных ограничений.

Спасибо за статью.

А алгоритм отличает, если значение колонки стало NULL? То есть, было в колонке значение XXX и поменялось на NULL. Что будет записано в SCD-таблицу?

Если в колонку valid_to_dt всегда пишется максимальная дата кроме удалённых строчек, так может и заполнять её только для удалённых строчек, а для других случаев писать NULL?

Если значение в какой-либо колонке станет NULL, то добавится новая запись в таблицу уже с NULL. Исходные данные никак не модифицируются при записи в SCD-2 таблицу.

Пустые значения заменяются в колонках только при расчете хеш сумм и подготовке первичного ключа.

По поводу заполнения valid_to_dt - так можно делать, конечно, но, это нужно будет потом обязательно учитывать при построении срезов данных на заданную дату (функция get_data_slice_on_target_date). Вместо простого условие отбора filter(F.col("valid_to_dt") >= F.to_date(F.lit(target_dt)) нужно будет использовать более сложное filter((F.col("valid_to_dt") >= F.to_date(F.lit(target_dt))) | (F.col("valid_to_dt").isNull())). А это уже становится не так очевидно для конечных пользователей, следовательно, растет вероятность ошибки.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Информация

Сайт
x5.tech
Дата регистрации
Дата основания
2006
Численность
свыше 10 000 человек
Местоположение
Россия