Data Vault за один вечер
Решила я тут погрузиться в дата волт на практике. Нашла интересный проект — AutomateDV (бывший dbtvault)
У них есть демо-проект, в котором создаются разные сущности, несколько видосов с объяснениями и небольшая, но очень детальная дока
💻 Поставила себе по инструкции dbt-core, dbt-postgres:
Подключила AutomateDV — это просто пакет в dbt-проекте, задается в packages.yml:
Подняла постгрю в докере, настроила коннекшены, создала проект:
Сгенерила данные из датасета TPC-H и положила их в volume:
Создала таблицы и загрузила в них данные:
🐾 Поначалу я смотрела видосы и делала все ручками. Потом забила и чисто запускала модельки, смотрела, что получается. Фреймворк автоматизирует создание дата волта. Во-первых, для стейджинга можно использовать такие поля:
derived_columns - новые поля
hashed_columns - поля для хэширования
Тут мы добавили поле как алиас другого, поле с константной строкой, сделали хэш из 2х первичный ключей:
Во-вторых, создание самих сущностей происходит с помощью удобных макросов:
Все модельки можно позапускать, а потом сгенерить доку по проекту:
😅 Но саааамое прикольное — это после компиляции моделек зайти в папку target/ и посмотреть, что там нагенерилось. И еще сходить в исходный код самого пакета в dbt_packages/
А нагенерилось там вот такое:
В общем, интересно поковыряться, как они придумали, и вдохновиться, если у вас сложнее/что-то забыли учесть/еще не реализовали
@data_engineerette
Решила я тут погрузиться в дата волт на практике. Нашла интересный проект — AutomateDV (бывший dbtvault)
У них есть демо-проект, в котором создаются разные сущности, несколько видосов с объяснениями и небольшая, но очень детальная дока
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
А нагенерилось там вот такое:
—хэширование нескольких полей
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
🔥16❤7🤔5 1
Куда катится рынок?
Недавно заходила послушать обсуждение текущей ситуации на рынке. Что интересного оттуда записала:
1️⃣ Сейчас есть смысл просить 300-350-400. Потому что вместо разраба за 500-600 возьмут обычного + дадут ему иишку. Хотя еще совсем недавно говорили, что занижать себе цену тоже не надо
— видимо, больше не работает
А вот вилка по аутстаффу — вообще максимум 280-300 на руки
2️⃣ На hh есть плашка "Конкретные достижения". Она видна только hr. И резюме с такой плашкой чаще показывается работодателям. Если у вас нет красивых циферок, то отсутствие плашки — доп фильтр, резюме даже не откроют
3️⃣ "О себе" могут читать первым, поэтому этот раздел нужно заполнять. Но без банальностей по типу "стрессоустойчивый, люблю решать сложные задачи, саморазвиваться"
4️⃣ Нужно хорошо общаться в переписке, без грубости и отношения "все должны" (база, но все же)
5️⃣ Когда спрашивают про мотивацию, никогда не упоминать токсичность
@data_engineerette
Недавно заходила послушать обсуждение текущей ситуации на рынке. Что интересного оттуда записала:
Извините, неудачники нам не нужны
— видимо, больше не работает
А вот вилка по аутстаффу — вообще максимум 280-300 на руки
@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
❤18🌚10🔥6🤔5
Airflow для менеджеров
В Ariflow 3.1 появилась группа hitl-операторов, которая позволяет что-то вводить пользаку во время работы дага
🫠 Что делает пример на картинках?
Мы задаем даты, выбираем сервисы из списка, вводим почту и получаем отчет. Операторы по сути помогают менеджерам не дергать DA/DE своими адхоками, а пойти самому накликать и выгрузить то, что нужно
🤓 А как это происходит?
В базовых примерах после разворачивания airflow появится даг
🤩 HITLOperator — выбрать одну или несколько опций из списка
🤩 HITLEntryOperator — ввести любой текст
🤩 HITLBranchOperator — выбрать следующую таску
🤩 ApprovalOperator — одобрить или отклонить
В коде выглядит это вот так:
Когда заходите в UI, после запуска дага появляется доп вкладка
Из xcom потом можно достать в других тасках. Сначала обращаетесь по названию таски, а потом работаете, как с обычным словарем:
Use case очень прикольный. Интересно, а вот на практике этим будут пользоваться?
@data_engineerette
В Ariflow 3.1 появилась группа hitl-операторов, которая позволяет что-то вводить пользаку во время работы дага
HITL = Human-in-the-loop
Мы задаем даты, выбираем сервисы из списка, вводим почту и получаем отчет. Операторы по сути помогают менеджерам не дергать DA/DE своими адхоками, а пойти самому накликать и выгрузить то, что нужно
В базовых примерах после разворачивания airflow появится даг
example_hitl_operator. Там есть несколько операторов из пакета airflow.providers.standard.operators.hitl:В коде выглядит это вот так:
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
4❤15👍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
В последнем спринте работала над таской, связанной с OpenMetadata. Она была поначалу настолько непонятой, что пришлось присоединиться к коммьюнити в Slack
Могу сказать, что у них просто офигенная поддержка в чате, на вопросы они отвечают в течение получаса. Как только я присоединилась, на меня сразу вышел чел с ролью «Developer Advocate». Он рассказал, что у них происходит в чатах, какие они организуют вебинары и что можно забукать небольшую встречку
Поначалу я скептически отнеслась, вопросов с моей стороны не было, да и вообще потом забыла, но спустя время решила встретиться поболтать
Дата-контакты в OMD — это как второй этап проверки. Мы однажды напоролись на такое, что данные вставлялись без проблем даже при изменении схемы на источнике. Потому что мы в коде брали из датафрейма только столбцы, которые уже были в таргет-таблице
Дальше мы пошли в сендбокс. Посмотрели, как дата-контракты поддерживают изменения схемы, data quality, штуки для безопасности (все, что на скрине). Контракты можно импортнуть и экспортнуть в формате ODCS (Open Data Contract Standard)
Еще мне рассказали, что OpenMetadata стартанула всего лишь 5 лет назад! А 10.06 у них будет бесплатный онлайн-саммит Collate Summit '26: Data & AI in Production, на который можно зарегаться
После встречи деврел прислал несколько полезных ссылочек, которые мы обсуждали:
@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12🔥8 2
На пути к гуру алгосов
01.06 стартует новый поток курса от Глеба Михайлова, и я на него иду! Алгосы — это точно мое слабое место, и я прямо в превкушении почувствовать «азарт охотника, а не ужас жертвы»🐆
Я уже зарегалась на платформе, добавилась в чатик и посмотрела орг материалы — какой должен быть подход к обучению, нужно ли быть перфекционистом и как трекать свой прогресс
Курс разбит на 10 спринтов вплоть до 11.10. И ожидается, что мы должны уделять время на задачи 5 дней в неделю целое лето😭 😭
Скоро я эволюционирую до всезнающего леопарда, ну, а пока я — маленькая птичка, которая полетела разведывать остров алгоритмов🐦
@data_engineerette
01.06 стартует новый поток курса от Глеба Михайлова, и я на него иду! Алгосы — это точно мое слабое место, и я прямо в превкушении почувствовать «азарт охотника, а не ужас жертвы»🐆
Я уже зарегалась на платформе, добавилась в чатик и посмотрела орг материалы — какой должен быть подход к обучению, нужно ли быть перфекционистом и как трекать свой прогресс
Курс разбит на 10 спринтов вплоть до 11.10. И ожидается, что мы должны уделять время на задачи 5 дней в неделю целое лето
Скоро я эволюционирую до всезнающего леопарда, ну, а пока я — маленькая птичка, которая полетела разведывать остров алгоритмов🐦
@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
leopard.school
Курс по алгоритмам с Глебом Михайловым
50 часов видео, 241 задача с LeetCode, 500+ студентов.
🔥11 5😁4😭2
Случайно замедлили все загрузки
Небольшая история о том, как можно ухудшить состояние кластера, не добавив и строчки кода😁
Предыстория
У нас в airflow есть много дагов, которые качают данные из бд. Чтобы не положить базу, мы используем пулы, которые ограничивают количество подключений
Как-то мы реализовали новый тип загрузки и, как порядочные разрабы, про пулы тоже не забыли. Долгое время данные грузились, все работало — с этой стороны не было проблем. Но однажды к нам пришел аналитик и спросил, почему таски висят в статусе scheduled по несколько часов. И вот тогда мы поняли😁
Проблема
Таска-загрузчик находилась в одной таск-группе вместе с другими легковесными тасочками. И они все наследовали одни и те же значения! Получается, что таске передавалось 100500 слотов, даже если она вообще не ходила в базу😱 И когда загрузчик требовал много слотов, абсолютно все простаивало, потому что больше ничего не помещалось😱 😱
Решение
Тут все просто: выпилить параметр из тех тасок, где он не нужен
Мораль
Можем подытожить так: даже если все зеленое и все считается, это не значит, что все хорошо🤨
@data_engineerette
Небольшая история о том, как можно ухудшить состояние кластера, не добавив и строчки кода
Предыстория
У нас в airflow есть много дагов, которые качают данные из бд. Чтобы не положить базу, мы используем пулы, которые ограничивают количество подключений
Как-то мы реализовали новый тип загрузки и, как порядочные разрабы, про пулы тоже не забыли. Долгое время данные грузились, все работало — с этой стороны не было проблем. Но однажды к нам пришел аналитик и спросил, почему таски висят в статусе scheduled по несколько часов. И вот тогда мы поняли
Проблема
Таска-загрузчик находилась в одной таск-группе вместе с другими легковесными тасочками. И они все наследовали одни и те же значения! Получается, что таске передавалось 100500 слотов, даже если она вообще не ходила в базу
Решение
Тут все просто: выпилить параметр из тех тасок, где он не нужен
Мораль
Можем подытожить так: даже если все зеленое и все считается, это не значит, что все хорошо
@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
😁14👍6🔥2❤1💅1
ClickOps
Мне тут пришло в голову покопаться в сервисах AWS и поделать какие-нибудь лабы. На ютубе довольно много видосов от индусов (и не только) на эту тему, я в итоге решила посмотреть вот этот 4х-часовой туториал с пет-проектом
🎙 Там парень очень понятно рассказывает про теорию и сервисы, показывает, как что делать. К акценту надо привыкнуть, но вроде норм) Говорит он супер быстро, как будто на x1.5 смотришь. Одна из фраз, которая красной линией проходит по видосу:
Еще сайтец у него есть полезный, там очень много инфы собрано
💻 В чем суть проекта? Взять данные из файлов и API, залить в S3, переложить по слоям, добавить dq, настроить алерты, собрать витрину и поставить на расписание. Используя тех стек AWS: S3, Glue, Lambda, Athena, Step Functions, CloudWatch, SNS
Вся эта история поместилась в 5 питонячих файлов и 4 джейсонины. Поэтому проект натолкнул меня на несколько логичных мыслей, но над которыми я не задумывалась:
1️⃣ Девопсы вообще не нужны — все и так настроено и работает
2️⃣ Платформенные решения, фреймворки для витрин тоже не нужны — достаточно написать одну Glue-джобку и запускать ее с разными конфигами
3️⃣ Основная работа DE — нажимать на кнопочки и заполнять формочки
Создать таблицу? 4 клика
Загрузить csv в таблицу? 6 кликов
Добавить поле? Перетащить прямоугольничек
Партицировать таблицу? Выбрать колонку из списка
Выделить инкремент для загрузки? Включить опцию
Оно примерно так и есть, или я пока что-то упускаю?
@data_engineerette
Мне тут пришло в голову покопаться в сервисах AWS и поделать какие-нибудь лабы. На ютубе довольно много видосов от индусов (и не только) на эту тему, я в итоге решила посмотреть вот этот 4х-часовой туториал с пет-проектом
Сейчас никто не пишет код сам. Если вы хотите что-то реализовать или столкнулись с проблемой — идите к ChatGPT
Еще сайтец у него есть полезный, там очень много инфы собрано
Вся эта история поместилась в 5 питонячих файлов и 4 джейсонины. Поэтому проект натолкнул меня на несколько логичных мыслей, но над которыми я не задумывалась:
Создать таблицу? 4 клика
Загрузить csv в таблицу? 6 кликов
Добавить поле? Перетащить прямоугольничек
Партицировать таблицу? Выбрать колонку из списка
Выделить инкремент для загрузки? Включить опцию
Оно примерно так и есть, или я пока что-то упускаю?
@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
💅8❤6
AI-эра тех собесов
💻 Теперь вместе с sql/python-задачками на тех собесе могут дать создание мини-проекта за 20 минут
Разрешается использовать все, что угодно, любые ллм. (Только подумайте над тем, что будет работать, когда вы на созвоне на внутренней платформе.) Есть только одно условие — шерить экран
Примеры заданий
➡️ Для де: написать ddl таблиц, sql-запросы по сборке витрин, несколько дагов
➡️ Для разраба: придумать архитектуру микросервиса и реализовать его
➡️ Разобраться в коде и найти баги
Сгенерили, а дальше?
🙂 Интервьюеры могут сами пока не до конца понимать, что делать после генерации кода) Они просто сидят и смотрят, как ты будешь разбираться, что происходит, просят внести правки или объяснить кусок кода
Пока такое замечено в WB в последние 2 месяца, но могут подтянуться и остальные. Особенно после этого поста😁
@data_engineerette
Разрешается использовать все, что угодно, любые ллм. (Только подумайте над тем, что будет работать, когда вы на созвоне на внутренней платформе.) Есть только одно условие — шерить экран
Примеры заданий
Сгенерили, а дальше?
Пока такое замечено в WB в последние 2 месяца, но могут подтянуться и остальные. Особенно после этого поста
@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔16🔥15❤5😁4