дата инженеретта
3.33K subscribers
280 photos
28 videos
4 files
120 links
мелкое — крупно,
в глубоком разговоре
мудрость приходит

по вопросам сюда: @aigul_sea
Download Telegram
Data Vault за один вечер

Решила я тут погрузиться в дата волт на практике. Нашла интересный проект — AutomateDV (бывший dbtvault)

У них есть демо-проект, в котором создаются разные сущности, несколько видосов с объяснениями и небольшая, но очень детальная дока

💻 Поставила себе по инструкции dbt-core, dbt-postgres:


python -m pip install dbt-core dbt-postgres


Подключила AutomateDV — это просто пакет в dbt-проекте, задается в packages.yml:


dbt deps


Подняла постгрю в докере, настроила коннекшены, создала проект:


dbt init


Сгенерила данные из датасета TPC-H и положила их в volume:


pip install tpchgen-cli
mkdir data
tpchgen-cli -s 1 -f csv -o ./data


Создала таблицы и загрузила в них данные:


COPY region FROM '/var/lib/postgresql/data/data/region.csv' DELIMITER ',' CSV HEADER;


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

derived_columns - новые поля
hashed_columns - поля для хэширования

Тут мы добавили поле как алиас другого, поле с константной строкой, сделали хэш из 2х первичный ключей:


{%- set yaml_metadata -%}
source_model: 'raw_orders'
derived_columns:
CUSTOMER_KEY: 'CUSTOMERKEY'
RECORD_SOURCE: '!TPCH-ORDERS'
hashed_columns:
ORDER_CUSTOMER_PK:
- 'CUSTOMER_KEY'
- 'ORDERKEY'
...


Во-вторых, создание самих сущностей происходит с помощью удобных макросов:


automate_dv.stage()
automate_dv.hub()
automate_dv.sat()
automate_dv.link()
automate_dv.pit()
...


Все модельки можно позапускать, а потом сгенерить доку по проекту:


dbt run -s +v_stg_orders
dbt run -s hub_customer

dbt docs generate
dbt docs serve


😅 Но саааамое прикольное — это после компиляции моделек зайти в папку target/ и посмотреть, что там нагенерилось. И еще сходить в исходный код самого пакета в dbt_packages/

А нагенерилось там вот такое:


—хэширование нескольких полей
DECODE(MD5(NULLIF(CONCAT_WS('||',
COALESCE(NULLIF(UPPER(TRIM(CAST(CUSTOMER_KEY AS VARCHAR))), ''), '^^'),
COALESCE(NULLIF(UPPER(TRIM(CAST(ORDERKEY AS VARCHAR))), ''), '^^')
), '^^||^^')), 'hex') AS ORDER_CUSTOMER_PK,


—отбор по rn для инсерта в линки
ROW_NUMBER() OVER(
PARTITION BY rr.ORDER_CUSTOMER_PK
ORDER BY rr.LOAD_DATE
) AS row_number

—отбор уникальных значений в сателлит по хешу
WHERE b.INVENTORY_HASHDIFF != b.prev_hashdiff


В общем, интересно поковыряться, как они придумали, и вдохновиться, если у вас сложнее/что-то забыли учесть/еще не реализовали

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥167🤔51
Куда катится рынок?

Недавно заходила послушать обсуждение текущей ситуации на рынке. Что интересного оттуда записала:

1️⃣ Сейчас есть смысл просить 300-350-400. Потому что вместо разраба за 500-600 возьмут обычного + дадут ему иишку. Хотя еще совсем недавно говорили, что занижать себе цену тоже не надо

Извините, неудачники нам не нужны


— видимо, больше не работает

А вот вилка по аутстаффу — вообще максимум 280-300 на руки

2️⃣ На hh есть плашка "Конкретные достижения". Она видна только hr. И резюме с такой плашкой чаще показывается работодателям. Если у вас нет красивых циферок, то отсутствие плашки — доп фильтр, резюме даже не откроют

3️⃣ "О себе" могут читать первым, поэтому этот раздел нужно заполнять. Но без банальностей по типу "стрессоустойчивый, люблю решать сложные задачи, саморазвиваться"

4️⃣ Нужно хорошо общаться в переписке, без грубости и отношения "все должны" (база, но все же)

5️⃣Когда спрашивают про мотивацию, никогда не упоминать токсичность

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
18🌚10🔥6🤔5
Airflow для менеджеров

В Ariflow 3.1 появилась группа hitl-операторов, которая позволяет что-то вводить пользаку во время работы дага

HITL = Human-in-the-loop


🫠 Что делает пример на картинках?

Мы задаем даты, выбираем сервисы из списка, вводим почту и получаем отчет. Операторы по сути помогают менеджерам не дергать DA/DE своими адхоками, а пойти самому накликать и выгрузить то, что нужно

🤓 А как это происходит?

В базовых примерах после разворачивания airflow появится даг example_hitl_operator. Там есть несколько операторов из пакета airflow.providers.standard.operators.hitl:

🤩HITLOperator — выбрать одну или несколько опций из списка
🤩HITLEntryOperator — ввести любой текст
🤩HITLBranchOperator — выбрать следующую таску
🤩ApprovalOperator — одобрить или отклонить

В коде выглядит это вот так:


wait_for_multiple_options = HITLOperator(
task_id="wait_for_multiple_options",
subject="Please choose option to proceed: ",
options=["option 1", "option 2", "option 3"],
multiple=True,
defaults=["option 1"],
)


Когда заходите в UI, после запуска дага появляется доп вкладка Required Actions (1), где и нужно прожать опцию. Это все потом отправляется в xcom:


{
"params_input": {},
"responded_at": "datetime.datetime@version=2(tz=(UTC,pendulum.tz.timezone.Timezone,1,True),timestamp=1778505898.269782)",
"chosen_options": [
"option 2",
"option 3"
],
"responded_by_user": {
"id": "1",
"name": "airflow"
}
}


Из xcom потом можно достать в других тасках. Сначала обращаетесь по названию таски, а потом работаете, как с обычным словарем:


{{ ti.xcom_pull(task_ids='wait_for_multiple_options')["chosen_options"] }}

{{ ti.xcom_pull(task_ids='wait_for_input')["params_input"]["information"] }}


Use case очень прикольный. Интересно, а вот на практике этим будут пользоваться?

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
415👍8🔥8
Познакомилась с деврелом из OpenMetadata

В последнем спринте работала над таской, связанной с OpenMetadata. Она была поначалу настолько непонятой, что пришлось присоединиться к коммьюнити в Slack🤩

Могу сказать, что у них просто офигенная поддержка в чате, на вопросы они отвечают в течение получаса. Как только я присоединилась, на меня сразу вышел чел с ролью «Developer Advocate». Он рассказал, что у них происходит в чатах, какие они организуют вебинары и что можно забукать небольшую встречку

Поначалу я скептически отнеслась, вопросов с моей стороны не было, да и вообще потом забыла, но спустя время решила встретиться поболтать🙂 Мы довольно мило побеседовали про наше использование инструмента, про их новые фичи. Он мне рассказал, что в последней версии:

🤩джобы запускаются не в airflow, а стартуют отдельные поды в k8s
🤩поддерживается дата-контракты

Дата-контакты в OMD — это как второй этап проверки. Мы однажды напоролись на такое, что данные вставлялись без проблем даже при изменении схемы на источнике. Потому что мы в коде брали из датафрейма только столбцы, которые уже были в таргет-таблице🙂

Дальше мы пошли в сендбокс. Посмотрели, как дата-контракты поддерживают изменения схемы, data quality, штуки для безопасности (все, что на скрине). Контракты можно импортнуть и экспортнуть в формате ODCS (Open Data Contract Standard)

Еще мне рассказали, что OpenMetadata стартанула всего лишь 5 лет назад! А 10.06 у них будет бесплатный онлайн-саммит Collate Summit '26: Data & AI in Production, на который можно зарегаться

После встречи деврел прислал несколько полезных ссылочек, которые мы обсуждали:

📍OpenMetadata’s Kubernetes Scheduler Preview

📍Data Contracts and OpenMetadata

📍OpenMetadata Standards & Building new Connectors with AI

📍OpenMetadata Standards

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
12🔥82
На пути к гуру алгосов

01.06 стартует новый поток курса от Глеба Михайлова, и я на него иду! Алгосы — это точно мое слабое место, и я прямо в превкушении почувствовать «азарт охотника, а не ужас жертвы»🐆

Я уже зарегалась на платформе, добавилась в чатик и посмотрела орг материалы — какой должен быть подход к обучению, нужно ли быть перфекционистом и как трекать свой прогресс

Курс разбит на 10 спринтов вплоть до 11.10. И ожидается, что мы должны уделять время на задачи 5 дней в неделю целое лето 😭 😭

Скоро я эволюционирую до всезнающего леопарда, ну, а пока я — маленькая птичка, которая полетела разведывать остров алгоритмов🐦

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥115😁4😭2
Случайно замедлили все загрузки

Небольшая история о том, как можно ухудшить состояние кластера, не добавив и строчки кода😁

Предыстория

У нас в airflow есть много дагов, которые качают данные из бд. Чтобы не положить базу, мы используем пулы, которые ограничивают количество подключений

Как-то мы реализовали новый тип загрузки и, как порядочные разрабы, про пулы тоже не забыли. Долгое время данные грузились, все работало — с этой стороны не было проблем. Но однажды к нам пришел аналитик и спросил, почему таски висят в статусе scheduled по несколько часов. И вот тогда мы поняли 😁

Проблема

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

Решение

Тут все просто: выпилить параметр из тех тасок, где он не нужен

Мораль

Можем подытожить так: даже если все зеленое и все считается, это не значит, что все хорошо🤨

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
😁14👍6🔥21💅1
Когда никто не понимает, как делать задачу😂
😁31
ClickOps

Мне тут пришло в голову покопаться в сервисах AWS и поделать какие-нибудь лабы. На ютубе довольно много видосов от индусов (и не только) на эту тему, я в итоге решила посмотреть вот этот 4х-часовой туториал с пет-проектом

🎙 Там парень очень понятно рассказывает про теорию и сервисы, показывает, как что делать. К акценту надо привыкнуть, но вроде норм) Говорит он супер быстро, как будто на x1.5 смотришь. Одна из фраз, которая красной линией проходит по видосу:

Сейчас никто не пишет код сам. Если вы хотите что-то реализовать или столкнулись с проблемой — идите к ChatGPT


Еще сайтец у него есть полезный, там очень много инфы собрано

💻 В чем суть проекта? Взять данные из файлов и API, залить в S3, переложить по слоям, добавить dq, настроить алерты, собрать витрину и поставить на расписание. Используя тех стек AWS: S3, Glue, Lambda, Athena, Step Functions, CloudWatch, SNS

Вся эта история поместилась в 5 питонячих файлов и 4 джейсонины. Поэтому проект натолкнул меня на несколько логичных мыслей, но над которыми я не задумывалась:

1️⃣Девопсы вообще не нужны — все и так настроено и работает

2️⃣Платформенные решения, фреймворки для витрин тоже не нужны — достаточно написать одну Glue-джобку и запускать ее с разными конфигами

3️⃣Основная работа DE — нажимать на кнопочки и заполнять формочки

Создать таблицу? 4 клика
Загрузить csv в таблицу? 6 кликов
Добавить поле? Перетащить прямоугольничек
Партицировать таблицу? Выбрать колонку из списка
Выделить инкремент для загрузки? Включить опцию

Оно примерно так и есть, или я пока что-то упускаю?

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
💅86
AI-эра тех собесов

💻 Теперь вместе с sql/python-задачками на тех собесе могут дать создание мини-проекта за 20 минут

Разрешается использовать все, что угодно, любые ллм. (Только подумайте над тем, что будет работать, когда вы на созвоне на внутренней платформе.) Есть только одно условие — шерить экран

Примеры заданий

➡️Для де: написать ddl таблиц, sql-запросы по сборке витрин, несколько дагов

➡️Для разраба: придумать архитектуру микросервиса и реализовать его

➡️Разобраться в коде и найти баги

Сгенерили, а дальше?

🙂 Интервьюеры могут сами пока не до конца понимать, что делать после генерации кода) Они просто сидят и смотрят, как ты будешь разбираться, что происходит, просят внести правки или объяснить кусок кода

Пока такое замечено в WB в последние 2 месяца, но могут подтянуться и остальные. Особенно после этого поста😁

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔16🔥155😁4