🔍 ETL с помощью SQL: Инкрементальная загрузка 🔍 ✨ В отличие от полной перезагрузки (Full Reload), описанного в этом посте, инкрементальная загрузка перемещает только новые или обновленные данные. Это экономит ресурсы и время, особенно при работе с большими объемами данных. Давайте поговорим о ключевых этапах этого процесса: 1️⃣ Определение инкремента данных Инкремент - набор данных, которые нужно загрузить. Он может определяться как набор новых строк в источнике, так и набор строк с обновленными значениями. Для определения инкремента обычно используются поля со смыслом как "дата обновления записи", "дата создания записи" и др. с похожим смыслом, по которым можно сделать выборку нужного инкремента. Пример выделения инкремента из таблицы source по условию, что поле update_date имеет сегодняшнюю дату SELECT * FROM source s WHERE update_date = CURRENT_DATE() 2️⃣ Вставка инкремента в target таблицу Пример запроса может выглядеть так: INSERT INTO target SELECT * FROM source s WHERE update_date = CURRENT_DATE(); Здесь есть нюанс, что в таблицу target попадут все записи инкремента и останутся те, которые были уже в таблице например под одним и тем же id. Таким образом может собираться накопительная историческая таблица, например с продажами. К примеру в таблице target уже была запись по продаже с id = 5 и status = 'buy'. А в новом инкременте из source прилетит обновленная строка с id = 5 и status = 'cancelled'. Таким образом в target будет зафиксирована вся история обновления строк. Если в target таблице нужно оставить только актуальную версию данных без исторического состояния, такой способ я распишу в одном из следующих постов этой серии. Оставляйте реакции, если пост был полезен 😉
🔍 ETL с помощью SQL: Инкрементальная загрузка с обновлением данных🔍 ✨ В предыдущем посте мы разобрали инкрементальную загрузку с сохранением всей историчности данных. Давайте разберем загрузку инкремента, чтобы в target таблицы оставались только актуальные значения данных, т.е. исторические значение перезаписывались актуальными. Ключевые этапах этого процесса будут следующие: 1️⃣ Определение инкремента данных Пример выделения инкремента из таблицы source по условию, что поле update_date имеет сегодняшнюю дату SELECT * FROM source s WHERE update_date = CURRENT_DATE() Лучше нам результат запроса сохранить в промежуточную временную таблицу. CREATE TEMPORARY TABLE tmp_increment AS SELECT * FROM source s WHERE update_date = CURRENT_DATE() 2️⃣ Вставка инкремента в target таблицу с актуализацией значений данных (перезапись) Выполняем в 2 шага: 1) Удаляем данные из target, которые есть во временной таблице по уникальному идентификатору записи (например, id). Это удалит нам записи, которые нужно обновить DELETE FROM target WHERE id IN (SELECT id FROM tmp_increment); 2) Вставляем инкремент с актуальными записями из временной таблицы tmp_increment в target INSERT INTO target SELECT * FROM tmp_increment; Таким образом в target таблицу будут добавляться новые записи и перезаписываться обновленные актуальные записи из source Оставляйте реакции, если пост был полезен 😉