В рамках данной лабораторной работы необходимо:
- создать GitHub-репозиторий.
- произвести генерацию синтетических данных (одна таблица) с первым или вторым типом историчности, категориальными и количественными признаками (полей в выходящей таблице должно быть десять).
- сделать выгрузку таблицы в базу данных PostgreSQL, трансформировав данные от аномалий.
Детальное описание лабораторной работы:
- Поиск данных:
- Генерация синтетических данных: данные генерировать можно любым доступным способом. Можно прикрутить LLM (API, либо развернуть на мощности своей машины), так и сгенерировать любым другим способом. Как вариант: создать функцию get_dataset(...), в рамках которой будет проводиться генерация. Важно! Данные ОБЯЗАНЫ быть "сломанными" - чтобы их можно было почистить или структурировать далее.
- После генерации данных приступаем к загрузке ее в базу в формате "как есть" (например, с помощью Python или любого другого ETL-инструмента или языка программирования):
- Создать функцию, например, load_data_to_db(...) в рамках нее реализовать загрузку данных в базу в таблицу t_sql_source_unstructured.
- Создать схему s_psql_dds. Создать таблицы в этой схеме t_sql_source_unstructured (в этой таблице должны быть данные, которые вы загрузили в п.2) и t_sql_source_structured (то, куда вы загрузите очищенные и структурированные данные). Создать SQL-процедуру/SQL-функцию, которая будет убирать аномалии в данных и приводить данные в работоспособный вид (замечание: код избавления от аномалий должен быть написан исключительно на SQL! В качестве параметров функции/процедуры должны быть указаны) start_date и end_date - параметры с типом данных DATE.
- Например, можно создать PostgreSQL-функцию с названием fn_etl_data_load(start_date date, end_date date), в рамках которой будет проводиться трансформация данных и загрузка из загруженного в базу источника в предварительно подготовленную таблицу.
- Создать структуру репозитория: data-pipeline/"тут ваш проект на любом языке программирования, начиная с корневой папки (для питона: где main-py-файл - обычно, это корень)", sql/"dds(папки: table - Тут храниться будут ddl-таблиц, которые будут принимать участие в расчете, function - тут будут все функции, которые вы будете создавать для расчета, view - тут будут все представления") и выгрузить код в репозиторий.
- После написания SQL-функции создать функцию fill_structured_table(...) в приложении, которая будет просто запускать функцию fn_etl_data_load на PostgreSQL.
- Объединить функцию генерации датасета, функцию загрузки в неструктурированную таблицу и функцию запуска заполнения структурированной таблицы в одну верхнеуровневую функцию etl().
Пример структуры репозитория для пары Python - SQL (где написано init.txt - пустой файл, временное решение, постепенно будет наполняться кодом):
|-----------------------------------------------|
| data-pipeline/
|---- src/
|-------- get_dataset.py
|-------- load_data_to_db.py
|-------- fill_structured_table.py
|-------- etl.py
|-------- ...
|---- main.py
|---- config.py
|---- ...
| sql/
|---- dds/
|-------- s_sql_dds/
|------------ table/
|---------------- t_sql_source_unstructured.sql
|---------------- t_sql_source_structured.sql
|------------ function/
|---------------- fn_etl_data_load.sql
|------------ view/
|---------------- init.txt
|------------ trigger/
|---------------- init.txt
|------------ ...
|---- dm/
|-------- s_sql_dm/
|------------ table/
|---------------- init.txt
|------------ function/
|---------------- init.txt
|------------ view/
|---------------- init.txt
|------------ trigger/
|---------------- init.txt
|------------ ...
| .gitignore
| README.md
|-----------------------------------------------|
- Писать код маленькими буквами.
- Любой объект НАЧИНАТЬ называть следующим образом:
- для таблицы - t_: t_table
- для представления - v_: v_view
- для функции - fn_: fn_function
- для схемы - s_: s_schema
- использование Apache Airflow, DAG, DBT
- Код приложения и SQL-код работают и выдают данные в целевой таблице.
- Параметры функции в виде временного периода применяются в расчете.
- Наличие верхнеуровневой функции etl() в приложении, которая состоит из:
- запуска функции get_dataset(...)
- запуска функции load_data_to_db(...)
- запуска функции fill_structured_table(...)
- функция etl() должна быть без входных параметров. Три функции, перечисленные выше, могут иметь входные параметры, если это необходимо.
- Написанный и работающий Dockerfile для сборки проекта в контейнер.
- Написание автотестов (unit-tests) на работоспособность процедур:
- создание fn_etl_data_load_test(start_date date, end_date date), которая будет заполнять итоговую таблицу t_sql_source_structured_copy
- подключение библиотек pytest/junit/testng/др. для создания автотестов
- создание теста на запуск процедуры SQL (только локально, для п.6 сделать заглушку)
- покрытие кода тестами
- Создание GitHub Actions Pipeline, показывающий, что проект билдится с помощью докерфайла и тесты проходят.