/
Инкрементальная загрузка данных

Инкрементальная загрузка данных

Об инкрементальной загрузке данных

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

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

Настройка инкрементальной загрузки данных

Для настройки инкрементальной загрузки данных необходимо выполнить следующие шаги:

  1. Откройте набор данных, в который вы хотите добавить таблицу с инкрементальной загрузкой, нажмите Данные в верхней панели и щелкните Выбрать источник данных в выпадающем меню:

    Без имени-20240925-192721.png
  2. В открывшемся окне выберите JDBC и нажмите Выбрать:

    jdbc.png
  3. Создайте новое подключение к серверу или выберите существующее в в левой части окна:

  4. В правой части окна активируйте тумблер Инкрементальное обновление и заполните следующие поля:

    • Название таблицы – название таблицы которое будет отображаться в модели данных.

    • Текст запроса – текст запроса для получения данных. Запрос будет выполнять инкрементальную загрузку данных за определенный период времени, указанный обязательными параметрами @{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 день.

  5. Нажмите Добавить, чтобы добавить таблицу в набор данных. Теперь вы можете связать ее с таблицей фактов, а при необходимости её можно будет обновить вручную или автоматически. Таблица обновится согласно заданным настройкам инкрементальной загрузки.

  • Если в источнике изменится структура таблицы (например, если добавятся новые столбцы или у столбцов изменится тип данных), то инкрементальная загрузка перестанет работать. В этом случае вам придётся заново загрузить таблицу и настроить для нее инкрементальную загрузку.

  • Числовые значения, которые вы указываете для параметров Начало архивации данных и Начало инкрементального обновления не должны превышать 120 (как для месяцев, так и для дней).

При первой загрузке загружаются все данные - как для архивного периода, так и для инкрементального. При последующих обновлениях данные, которые попали в архивный период, не обновляются.

Внутренняя логика работы инкрементальной загрузки

Принципы работы алгоритма инкрементальной загрузки заключаются в следующем:

  1. Разбиение данных на партиции:

    • Данные разбиваются на партиции на основе указанной в настройках гранулярности (год, месяц, день). Это позволяет управлять загрузкой данных и минимизировать объем работы.

    • Разбиение данных на партиции помогает избежать лишней обработки и ускоряет процесс инкрементальной загрузки.

  2. Генерация запросов к источнику данных:

    • При инкрементальной загрузке генерируется несколько запросов к источнику. Каждый запрос отвечает за загрузку данных для конкретной партиции.

    • Количество запросов зависит от выбранной гранулярности и количества периодов, на которые делятся данные.

    • Запросы на загрузку выполняются параллельно.

  3. Управление уже загруженными данными:

    • Уже загруженные данные не удаляются, благодаря использованию функционала ClickHouse для работы с партициями (например, с помощью команды ATTACH PARTITION). Это позволяет обновлять только новые или измененные данные, сохраняя уже загруженную информацию без изменений.

  4. Работа с ключом партиции:

    • Для каждой таблицы в системе добавляется служебная колонка 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\')


Смотрите также

Загрузка данных

 

Related content