fa
Feedback
дата инженеретта

дата инженеретта

رفتن به کانال در Telegram

мелкое — крупно, в глубоком разговоре мудрость приходит по вопросам сюда: @aigul_sea

نمایش بیشتر
3 348
مشترکین
+424 ساعت
-127 روز
+430 روز
آرشیو پست ها
Кидаю ссылочку на буст канала Пишите свои пожелания по реакциям) https://t.me/boost/data_engineerette

💬Наш командный сленг Просто захотелось записать крутые словечки, которые мы используем внутри команды) Некоторые могут быть
💬Наш командный сленг Просто захотелось записать крутые словечки, которые мы используем внутри команды) Некоторые могут быть общепринятыми, но мы с коллегами постарались накидать своих особенных: 🔠 aboba - почти дефолтный нейминг всяких тестовых табличек, файликов, переменных 🔠 Багулина - баг Базёнка - база данных Биг боссы - руководители 🔠 Грядка - ряд рабочих мест 🔠 Джирафлоу - перемещение задачек по статусам в джире Дикий интернет - интернет нормального человека Дип дайв - образовательная техническая встреча, где кто-то из коллег рассказывает про крутые штуки Дорогие коллеги - устойчивое выражение по отношению к коллегам 🔠 Жира - джира 🔠 ЗНОпс (запрос на обслуживание) - история с заведением заявок, получением согласований 🔠 Каминг-аут - релиз Кодулина/эскуэлина - кусочек кода kutuza moment - когда мы переехали с кутузы в другой офис, все казалось непривычным: мыло само не льется, вода сама не включается. это выражение описывает такие моменты, когда ты стоишь ждешь мыла или забыл выключить кран 🔠 Миграция/интеграция с хх - когда коллега собирается уйти 🔠 Ореховая леди - женщина, которая с утра раскладывает орешки Особый стендап - прощальный стендап 🔠 Падаван - джун Плов - Airflow Пользак - пользователь Проблема будущих нас - как Скарлетт, которая подумает обо всем завтра 🔠 Синк - встреча нескольких команд, чтобы обсудить статусы Скам мастер - скрам мастер Смотритель зоопарка, сопровод - сопровождение С улицы - когда коллега пришел не из Сбера 🔠 Технина - у нас был коллега, который работал в яндексе. там у них проводились техтолики (типо techtalk). и я как-то предложила для Толика придумать даму сердца - Нину. теперь у нас есть технина)) Трубочист - девопсер 🔠 Узя - Oozie Улучшайзинг - процесс улучшения 🔠 Фактура, собрать фактуру - поресерчить, прийти с конкретными кейсами и вопросами 🔠 Хабуп - Hadoop Хадуповоды - название нашего чатика, где мы решаем проблемы с кластером Хомяк - папка /home 🔠 Человек-джоба - когда ручками запускаешь то, что можно автоматизировать 🔠 Ярн киллер, придет ярн киллер - одно из требований безы к витринкам - если они падают, то должен быть процесс, который придет и убьет поток. и наоборот - если поток падает, процесс приходит и убивает расчет витринки 💬А у вас есть что-то, что понимаете только вы?)

007. Надо брать и делать с Data engineer Пообщались с Айгуль Сибгатуллиной. Сейчас Айгуль работает в Сбербанке на позиции Dat
+1
007. Надо брать и делать с Data engineer Пообщались с Айгуль Сибгатуллиной. Сейчас Айгуль работает в Сбербанке на позиции Data Engineer. Также ведет свой канал в телеграмм @data_engineerette. Получился очень любопытный путь — несколько стажировок от фронтенда до бекэнда, опыт в консалтинг, потом аналитиком. И сейчас уже инженер данных. Как так получилось? Мы обсуждали сегодня в подкасте! 👇 Слушайте, где удобно! 👇 Яндекс.Музыка Youtube VK Приятного прослушивания! ❤️ #podcast

Вышел подкаст со мной! Теперь я звездочка 😊

Вопросы на middle+ 😵 Недавно позвали на собес, решила сходить для контента🤩 Для меня он был прям сильно нестандартным, т.к. больше гоняли по кейсам "что будешь делать, если" и задавали нетривиальные вопросы по технике. 🚩 Ниже краткий списочек тем и вопросов: DataOps Синхронная/асинхронная репликация Селективный запрос Покрывающий индекс Всегда ли план запроса отражает правду? Zookeeper MapReduce Spark Что делать, если надо показать отчет за месяц, а данных за один день нет? Что делать, если после загрузки в dwh данных в 3 раза больше? Золотая запись PL/SQL процедуры Движки в КХ MDM (master data management) Data Lineage Data Vault/Anchor/Звезда В каких случаях что выбирать? ACID WAL (Write-Ahead Logging) Что сложнее - update vs insert? Физические джойны Какую бд выберешь, если ...? Что делать, чтобы сравнить данные с источником, api? Как будешь решать нестандартную задачу? 👍 Можете порассуждать в комментах) #собес

🔵Колоночные базы vs Семейство колонок У нас закупаются корпоративные курсы, и я сейчас прохожу очередной по де) До этого не
🔵Колоночные базы vs Семейство колонок У нас закупаются корпоративные курсы, и я сейчас прохожу очередной по де) До этого не сталкивалась с семейством колонок, везде пишут по-разному, так что держите ликбез 🐹 Колоночная/столбцовая СУБД Columnar, Column-oriented DB Тут должно быть все понятно. Данные хранятся рядышком поколоночно, поэтому работают быстрее. Это реляционная база. Примеры: ClickHouse, Vertica, Snowflake, Google BigQuery. Семейство колонок Wide-column store А вот это уже NoSQL штука. 🖌Пример - таблица с пользователями. У каждой строки есть ключ:
Maria
Для каждого ключа задается семейство колонок:
personal_info, address
Для каждого семейства - сами колонки:
personal_info <- firstname, lastname, age address <- city, street
Сами колонки можно добавлять на лету, заполнять у строк по-разному или вообще оставлять пустыми (null не хранится). Примеры: HBase, Cassandra, Google BigTable, ScyllaDB. Тут статейка очень старенькая, но есть полезности. 😐 Я поняла семейство колонок как подтаблицу. Они не поддерживают джойны/подзапросы, поэтому OneToMany и все остальные моделируются вот так. По терминологии так до конца и непонятно. Вроде как и те, и другие - колоночные. Но первые реляционные, а вторые - нет. Как-то так)

🍄 Итоги розыгрыша 🍄 Кое-кому сегодня удача особенно подмигнула, и нашим победителем становится... Улмас Киличов ☺️☺️ Напишу, обсудим все детали. И буду думать, что бы еще интересного замутить) А пока всем хорошего дня и недели!

Что спросить на собесе? У HR, команды и руководителя. Недавно общались с коллегами и накидали свой список, что бы мы спросили
Что спросить на собесе? У HR, команды и руководителя. Недавно общались с коллегами и накидали свой список, что бы мы спросили/что обычно спрашивают: 1️⃣ Офис/удаленка/гибрид Условия согласования Обязательно ли с 9 до 18 или можно двигать, дорабатывать попозже 2️⃣ Выдается ли техника? Как вам доставят? Есть ли офис в вашем городе? 3️⃣ Новая команда или на замену? Команда может укомплектовываться, но может и разваливаться 4️⃣ Состав команды Сколько человек? Сколько дата инженеров/аналитиков, других ролей? Разбивка по джунам/мидлам/сеньорам? 5️⃣ Кто обучает? Кто лидит в команде: техлид, тимлид, продукт оунер? Кто делает code review? 6️⃣ Аутсорс/аутстаф? 7️⃣ Какие инструменты, технологии? Скорее всего, к этому моменту вам уже все рассказали 8️⃣ Скрам или канбан? Канбан означает, что команда типо сервисная, много ad hoc-ов Есть ли Jira, Confluence или что-то подобное? 9️⃣ Есть ли системный аналитик? Если нет, то придется вам копаться в документации и общаться с заказчиками 1️⃣0️⃣ Кто заказчики? От кого ТЗ? Аналитики, бизнес, другие подразделения 1️⃣1️⃣ Описание рабочего дня Какие задачи? Бывают ли переработки? 1️⃣2️⃣ Какие KPI для сотрудника? Как расти в компании? 1️⃣3️⃣ Есть ли скрам-мастер? Проводится ли ретро? Глобальное демо на несколько команд? (например, раз в квартал) 1️⃣4️⃣ Культура командных посиделок Есть ли чатик с мемами?^^ 🐾Есть еще что добавить?

Как ПСИ проходили 🦆 Мы сейчас мигрируем витрины данных на свой кластер и перед каждым релизом проходим ПСИ. 🤓 ПСИ - это при
Как ПСИ проходили 🦆 Мы сейчас мигрируем витрины данных на свой кластер и перед каждым релизом проходим ПСИ. 🤓 ПСИ - это приемо-сдаточное испытание, где проверяют, а что за данные, а как, а почему, а с какой целью, а какой атрибутивный состав, а какая логика расчета и тому подобное. Что потоки с витринами успешно запускаются без падений. 👉 И вот во время созвона мы обнаруживаем, что для установки на прод не хватает release notes, которые автоматом проставляются. Т.к. это все для нас впервые, то мы не в курсах, как их быстро добавить. 🏃‍♂️ Пишу коллеге, который нам помогал по этому поводу, - не читает. Звоню(!): - Как проставить release notes? - Надо запустить доп. пайплайн в Jenkins - Где его найти? - Лежит рядом с основным (хотя бы это знаем) Иду в Jenkins, как заполнять поля - непонятно, смотрю примеры, делаю по аналогии, запускаю - отработало!!! 👨‍🦯 Лид тайм от реагирования до исполнения: 16 минут. ПСИ успешно пройдено. Mic Drop

Как ПСИ проходили 🦆 Мы сейчас мигрируем витрины данных на свой кластер и перед каждым релизом проходим ПСИ. 🤓 ПСИ - это при
Как ПСИ проходили 🦆 Мы сейчас мигрируем витрины данных на свой кластер и перед каждым релизом проходим ПСИ. 🤓 ПСИ - это приемо-сдаточное испытание, где проверяют, а что за данные, а как, а почему, а с какой целью, а какой атрибутивный состав, а какая логика расчета и тому подобное. Что потоки с витринами успешно запускаются без падений. 👉 И вот во время созвона мы обнаруживаем, что для установки на прод не хватает release notes, которые автоматом проставляются. Т.к. это все для нас впервые, то мы не в курсах, как их быстро добавить. 🏃‍♂️ Пишу коллеге, который нам помогал по этому поводу, - не читает. Звоню(!): - Как проставить release notes? - Надо запустить доп. пайплайн в Jenkins - Где его найти? - Лежит рядом с основным (хотя бы это знаем) Иду в Jenkins, как заполнять поля - непонятно, смотрю примеры, делаю по аналогии, запускаю - отработало!!! 👨‍🦯 Лид тайм от реагирования до исполнения: 16 минут. ПСИ успешно пройдено. Mic Drop

😊 Розыгрыш! 😊 Разыгрываю книжку "Spark в действии", которую даже сама читала в электронном варианте😁 Готова переслать по Р
😊 Розыгрыш! 😊 Разыгрываю книжку "Spark в действии", которую даже сама читала в электронном варианте😁 Готова переслать по России или лично вручить в Мск! Нужно: 1️⃣ Быть подписанным на канал 2️⃣ Оставить коммент - напишите любое ключевое слово из sql/spark/языков программирование/airflow итд итп Итоги будут подведены 17.06.2024 Удачи🙂

Логи расчетов Просто оставлю здесь это искусство🎨
Логи расчетов Просто оставлю здесь это искусство🎨

Пул мудростей Собрали с коллегами по несчастью папочку с полезными каналами про данные Велком, если хотите увеличить площадь
Пул мудростей Собрали с коллегами по несчастью папочку с полезными каналами про данные Велком, если хотите увеличить площадь вашего погружения) 🐤

DESCRIBE FORMATTED Посмотреть пути партиций в hdfs можно командой:
spark.sql("DESCRIBE FORMATTED web.visits partition (visit_date='2024-03-01')")
  .where("col_name = 'Location'")
  .select("data_type")
  .show()
DESCRIBE FORMATTED хранит инфу о полях и типах данных плюс метаинформацию (дату создания, партиции, форматы хранения, локацию) и возвращает примерно такую табличку:
+-----------------------------+ 
|col_name  |data_type |comment|
+-----------------------------+
|visit_date|string    |Дата   | 
|# Storage |          |       | 
|Location  |hdfs://...|       | 
+-----------------------------+
И после получения локации мы можем считать файл в датафрейм:
val df = spark.read.parquet("ctrl+c наш location")
#spark

Обработка больших данных Представьте, что у вас есть огромная таблица. Она накапливает по миллиарду строк на каждый день. И в
Обработка больших данных Представьте, что у вас есть огромная таблица. Она накапливает по миллиарду строк на каждый день. И вам нужно вытащить агрегаты за последние полгода. Если считать в лоб, то надо пройтись по ~ 1 млрд * 6 месяцев * 30 дней = 180 млрд строк 🔥 Вы запустили запрос, все зависло, кластер упал, оборудование перегрелось, дата центр сгорел - вас уволили и заставили влезть в кредиты😱😱😬😬 ну, или нет) Что делать? Такие таблицы обычно считаются по дням. Посчитали день - положили в датафрейм. Потом новый кусок объединили с предыдущими. Или так: посчитали - сохранили в таблицу. И каждый новый день по очереди дописывается. ❕ Поэтому семь раз режем, один раз мерим.✂️

🔠🔠🔠Unit-тесты для данных появились в версии dbt 1.8 https://docs.getdbt.com/docs/build/unit-tests https://github.com/dbt-labs/dbt-core/releases/tag/v1.8.0 Уже успели попробовать?

Есть идея крутой активности! Поделитесь, кто где обитает)
Anonymous voting

🧳 Рабочий кейс Недавно с коллегой обсуждали задачу: Нужно запускать расчеты по разным продуктам с разной начальной датой, чт
🧳 Рабочий кейс Недавно с коллегой обсуждали задачу: Нужно запускать расчеты по разным продуктам с разной начальной датой, чтобы не дублировать уже загруженную инфу. 1️⃣ Первая версия кода была такая - каждой функции по циклу:
for dt in pd.date_range(start_dt1, end_dt):
  load1(start_dt1)

for dt in pd.date_range(start_dt2, end_dt):
  load2(start_dt2)
И таких функций 10. 20. А Хотелось компактно организовать🎁 2️⃣ Вторая версия - итерируемся от минимальной даты и навешиваем условие перед запуском каждой функции:
min_dt = min(start_dt1, start_dt2)

for dt in pd.date_range(min_dt, end_dt):
  if dt >= start_dt1:
    load1(dt)
  elif dt >= start_dt2:
    load2(dt)
Тоже с условиями слишком громоздко🏔 3️⃣ В итоге мы дошли до такой финальной версии: ⭐️создаем функцию для генерации цикла по датам ⭐️создаем список функций с датами ⭐️передаем функции как аргументы
def loop(start_dt, end_dt, func):
  for dt in pd.date_range(start_dt, end_dt):
    func(dt)


func_list = [(load1, start_dt1), (load2, start_dt2)]

for func, dt in func_list:
  loop(dt, end_dt, func)
Чтобы добавить новую функцию, теперь достаточно дописать ее в func_list. А у вас есть идеи элегантного решения?

Как заруинить джойн в спарке? С помощью udf! 🧐 Что это? UDF (user defined function) - это функция, которую мы сами написали
Как заруинить джойн в спарке? С помощью udf! 🧐 Что это? UDF (user defined function) - это функция, которую мы сами написали и можем применить в спарке (и не только). 🤩 Пример Самый обычный джойн:
df1.join(df2, ['id'], 'inner')
План запроса - стандартный SortMerge (без деталей):
== Physical Plan ==
+- Project
   +- SortMergeJoin
      :- Sort
      :  +- Exchange hashpartitioning
      :     +- Filter isnotnull
      :        +- Scan ExistingRDD
      +- Sort ...

😭 Перепишем запрос через udf:
compare_udf = F.udf(lambda x, y: x == y, BooleanType()) 

df1.alias('df1') \
.join(
    df2.alias('df2'),
    compare_udf(
        F.col('df1.id'),
        F.col('df2.id')
    ),
    'inner'
)
И все - теперь у нас под капотом декартово произведение:
== Physical Plan ==
*(3) Project
+- *(3) Filter pythonUDF0#56: boolean
   +- BatchEvalPython [<lambda>(id#0L, id#4L)], [pythonUDF0#56]
      +- CartesianProduct
         :- *(1) Scan ExistingRDD
         +- *(2) Scan ExistingRDD
👀 А все потому, что для спарка udf - это черный ящик, и он не будет заглядывать вовнутрь. Так что схема такая: SortMerge -> Cartesian ShuffledHash -> Cartesian BroadcastHash -> BroadcastNestedLoop #spark

💕dbt deep dive💕 У нас в команде есть история с deep dive. Мы выбираем тему, собираем все наши знания и задачи, раскапываем всё. Потом делаем презу и просвещаем коллег. Эта преза моего дип дайва по dbt. Там рассказывается: ✔️что делает этот инструмент ✔️как создать проект ✔️что в этом проекте есть ✔️как запускать А вы какие фишки используете?