Инкрементальная загрузка данных
Об инкрементальной загрузке данных
Инкрементальная загрузка – это процесс добавления новых записей или обновления существующих данных без необходимости полной перезагрузки всей информации. Это помогает сэкономить ресурсы, так как полная перезагрузка больших объёмов данных требует значительных вычислительных мощностей и времени. Инкрементальный подход позволяет загружать только новые или изменившиеся данные, минимизируя затраты и значительно ускоряя процедуру загрузки данных.
Вы можете настроить инкрементальную загрузку для таблицы и затем обновлять её вручную или автоматически по мере необходимости.
Настройка инкрементальной загрузки данных
Для настройки инкрементальной загрузки данных необходимо выполнить следующие шаги:
Откройте набор данных, в который вы хотите добавить таблицу с инкрементальной загрузкой, нажмите Данные в верхней панели и щелкните Выбрать источник данных в выпадающем меню:
В открывшемся окне выберите JDBC и нажмите Выбрать:
Создайте новое подключение к серверу или выберите существующее в в левой части окна:
В правой части окна активируйте тумблер Инкрементальное обновление и заполните следующие поля:
Название таблицы – название таблицы которое будет отображаться в модели данных.
Текст запроса – текст запроса для получения данных. Запрос будет выполнять инкрементальную загрузку данных за определенный период времени, указанный обязательными параметрами
@{RangeStart}
и@{RangeEnd}
. Данные параметры рассчитываются автоматически на основе значений, которые вы введёте в полях Начало архивации данных и Начало инкрементального обновления. Началом инкрементального периода будет окончание архивного периода. Пример запроса (PostgreSQL):select brandname, colorname, classname, productkey, size, stylename, manufacturer from dimproduct where date_key>=date(@{RangeStart}) and date_key < date (@{RangeEnd});
где
SELECT brandname, colorname, classname, productkey, size, stylename, manufacturer
– столбцы, которые выбираются из таблицыdimproduct
.WHERE date_key >= date(@{RangeStart}) AND date_key < date(@{RangeEnd})
– условие фильтрации данных по дате.date_key
– название столбца, содержащего даты (это может быть любое название, которое вы назначили столбцу). Данный столбец должен обязательно присутствовать в таблице. Параметры@{RangeStart}
и@{RangeEnd}
определяют начальное и конечное значение диапазона дат соответственно. Дата преобразуется к типуDATE
с помощью функцииdate()
. Таким образом, запрос выбирает все записи, у которых дата (date_key
) находится между значениями@{RangeStart}
и@{RangeEnd}
. Это означает, что будут выбраны только те строки, которые были изменены или добавлены в указанный временной интервал.
В зависимости от используемой СУБД, вы можете использовать другие функции вместоdate()
в вашем SQL-запросе.
Начало архивации данных – определяет момент времени, начиная с которого данные будут архивироваться при загрузке. Данные, попадающие в этот временной интервал, загружаются только один раз. Если данные внутри этого диапазона изменятся в источнике, они повторно загружаться не будут. Архивный период будет автоматически увеличиваться с течением времени по мере поступления новых данных.
Начало инкрементального обновления – определяет точку отсчёта, с которой начинается инкрементальная загрузка данных. Например, если указано значение “2 дня до даты обновления”, то обновятся данные, которые появились в течении двух дней до начала обновления. Это значит, что система будет собирать и обрабатывать изменения, произошедшие за эти два дня, чтобы включить их в итоговую версию данных. Важно отметить, что эти «два дня» могут меняться в зависимости от текущей даты. С каждым новым днём он сдвигается вперёд, охватывая новые данные. Этот механизм называют “скользящим окном". При этом архивный период будет увеличиваться, как описано выше.
Пример:
Допустим, мы впервые обновили данные 30 января 2025 г. с теми настройками, как показано на картинке выше. Загрузились данные за последние 7 дней до 20.01.2025. Из них архивным периодом станет 5 дней, а инкрементальным – 2 дня (включая текущий).На следующий день мы обновим данные. В этом случае загрузятся данные, которые изменились в источнике за 2 дня до нашего обновления, а архивный период увеличится на 1 день.
Через 2 дня аналогично – данные за последние 2 дня обновятся, а архивный период увеличится.
Если мы обновим таблицу через неделю, снова загрузятся только те изменения, которые были внесены в источник за последние два дня, а архивный период будет сдвинут на неделю вперед.
Вы можете задавать разные комбинации для архивного и инкрементного периодов. Например, архивный период может составлять 3 месяца, а инкрементальный – 1 день.
Нажмите Добавить, чтобы добавить таблицу в набор данных. Теперь вы можете связать ее с таблицей фактов, а при необходимости её можно будет обновить вручную или автоматически. Таблица обновится согласно заданным настройкам инкрементальной загрузки.
Если в источнике изменится структура таблицы (например, если добавятся новые столбцы или у столбцов изменится тип данных), то инкрементальная загрузка перестанет работать. В этом случае вам придётся заново загрузить таблицу и настроить для нее инкрементальную загрузку.
Числовые значения, которые вы указываете для параметров Начало архивации данных и Начало инкрементального обновления не должны превышать 120 (как для месяцев, так и для дней).
При первой загрузке загружаются все данные - как для архивного периода, так и для инкрементального. При последующих обновлениях данные, которые попали в архивный период, не обновляются.
Внутренняя логика работы инкрементальной загрузки
Принципы работы алгоритма инкрементальной загрузки заключаются в следующем:
Разбиение данных на партиции:
Данные разбиваются на партиции на основе указанной в настройках гранулярности (год, месяц, день). Это позволяет управлять загрузкой данных и минимизировать объем работы.
Разбиение данных на партиции помогает избежать лишней обработки и ускоряет процесс инкрементальной загрузки.
Генерация запросов к источнику данных:
При инкрементальной загрузке генерируется несколько запросов к источнику. Каждый запрос отвечает за загрузку данных для конкретной партиции.
Количество запросов зависит от выбранной гранулярности и количества периодов, на которые делятся данные.
Запросы на загрузку выполняются параллельно.
Управление уже загруженными данными:
Уже загруженные данные не удаляются, благодаря использованию функционала ClickHouse для работы с партициями (например, с помощью команды ATTACH PARTITION). Это позволяет обновлять только новые или измененные данные, сохраняя уже загруженную информацию без изменений.
Работа с ключом партиции:
Для каждой таблицы в системе добавляется служебная колонка
partitionKey
, которая используется для управления партициями в процессе загрузки.Эта колонка обеспечивает корректную идентификацию и обработку данных, а также позволяет эффективно работать с партициями.
ПРИМЕР
Предположим, что вы указали 3 месяца для архивного периода и 3 месяца для инкрементального периода, а текущей датой является 21.01.2025:
В этом случае система рассчитает даты следующим образом:
Начало архивного периода:
21.01.2025 - 3 мес = 01.10.2024 (дата “округляется“ до первого дня месяца)
Начало инкрементального периода:
21.01.2025 - (3 - 1) мес = 01.11.2024
Для выполнения загрузки данных система отошлет четыре запроса: один для архивного периода и три для инкрементального:
для архивного периода:
select * from test_incremental where datekey >= date(\'2024-10-01\') and datekey < date(\'2024-11-01\')
для инкрементального периода:
select * from test_incremental where datekey >= date(\'2024-11-01\') and datekey < date(\'2024-12-01\')
select * from test_incremental where datekey >= date(\'2024-12-01\') and datekey < date(\'2025-01-01\')
select * from test_incremental where datekey >= date(\'2025-01-01\') and datekey < date(\'2025-02-01\')
Смотрите также
На этой странице
Время чтения: 2 мин.
Нужна дополнительная помощь?