Мы знаем, что есть ETL, а еще есть ELT. Когда я спрашиваю на собседованиях, в чем разница между ETL и ELT, а так же MPP и SMP (второе редко кто отвечает, даже если работали с MPP), мои руководители, спрашивают меня, зачем я это спрашиваю. Мне это важно, потому что показывает кругозор кандидата, это не вопрос про "почему люк круглый" или "сколько беременных женщин проезжает за день в московском метро".
На самом дела я хотел написать про Meta ETL. И это очень хороший подход, который позволяет избежать Copy-Paste ваших pipelines, jobs, transformations and so on.
Как раз такой мы и используем на Azure Data Factory. Весь ETL создан в Visual Studio на C#, за это можно поставить памятник моему коллеге, все это дело подвязано на Azure DevOps, и происходит Deploy на Dev/Prod. Это чистой воды Software Engineering проект, который делает ETL. Ничего сложней я не видел. Я уже профессионально овладел навыком Copy/Paste кусочков C# для создания нового pipeline. Я прям горд за себя!😊
Допустим, я сделал новы Databricks Notebook, который:
1. Берет файлы (
spark.read) и создает data frame
2. Дальше я могу менять data frame используя Pyspark сколько душе угодно
3. Записываю финальный data frame в таблицу (spark.write). Обычно добавляю партицию (заменяю). Но с Delta Lake можно позволить себе MERGE операцию.
Для каждой таблицы у меня отдельный notebook. Операция 1 и 3 унифицированы (обычная функция Python, которая на вход берет ряд параметром **read_parameters или **write_parameters в dictionary), а 2 это уникальный элемент для каждой таблицы.
Теперь, чтобы поставить это дело на расписание, я беру Azure Data Factory (вместо Databricks Jobs, Live Delta Tables) и создаю новый Pipeline (Copy Paste C# кусок и изменяю его). И все готово.
А если у меня 100 таблиц? Это значит без C# надо укликаться в ADF UI, чтобы все создать. С C# легче, просто копируем себе, а потом выстраиваем в одну большую очередь (назовем это Hand Made DAG). И запускаем.
Это все было не Meta ETL. А теперь подход Meta. Я создаю 1 pipeline в котором есть несколько циклов (Stages). Потом беру, например Azure SQL бд, в ней создаю таблицу - ETL_CONFIG и набор колонок. 1 строчка = 1 таблица (job, notebook). Идея в том, что мой единственный Pipeline будет запускать цикл (или несколько циклов) и на вход брать название таблицы.
То есть, я могу сделать один ETL job (даже в томже Airflow), который будет выполнять мои Databricks Notebooks по очереди с соблюдение зависимостей и приоритетов.
Нужно добавить новую таблицу? Легко, делаю новый notebook в Databricks и добавляю новую строчку в Azure SQL и все. Visual Studio даже открывать не надо (эх забуду свои навыки в C#🤔).
И тут я уже ограничен только фантазией, я могу так же сделать всего 1 Notebook вместо 100 (сейчас 1 таблица = 1 notebook), и так же передавать параметры и гонять его покругу.
Вот кстати
статья про это.
Я бы хотел сделать такой проектик в модуле 7, но нужны руки:)