дата инженеретта – Telegram
дата инженеретта
2.98K subscribers
242 photos
28 videos
4 files
102 links
мелкое — крупно,
в глубоком разговоре
мудрость приходит

по вопросам сюда: @aigul_sea
Download Telegram
🧳 Рабочий кейс

Недавно с коллегой обсуждали задачу:

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

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.
А у вас есть идеи элегантного решения?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤‍🔥441
🔠🔠🔠Unit-тесты для данных
появились в версии dbt 1.8

https://docs.getdbt.com/docs/build/unit-tests

https://github.com/dbt-labs/dbt-core/releases/tag/v1.8.0

Уже успели попробовать?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥81
Обработка больших данных

Представьте, что у вас есть огромная таблица. Она накапливает по миллиарду строк на каждый день. И вам нужно вытащить агрегаты за последние полгода.

Если считать в лоб, то надо пройтись по ~ 1 млрд * 6 месяцев * 30 дней = 180 млрд строк 🔥

Вы запустили запрос, все зависло, кластер упал, оборудование перегрелось, дата центр сгорел - вас уволили и заставили влезть в кредиты😱😱😬😬 ну, или нет)

Что делать?

Такие таблицы обычно считаются по дням. Посчитали день - положили в датафрейм. Потом новый кусок объединили с предыдущими.
Или так: посчитали - сохранили в таблицу. И каждый новый день по очереди дописывается.

Поэтому семь раз режем, один раз мерим.✂️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👏51
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
🔥10👌2💯2
Пул мудростей

Собрали с коллегами по несчастью папочку с полезными каналами про данные

Велком, если хотите увеличить площадь вашего погружения) 🐤
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6❤‍🔥2
Логи расчетов

Просто оставлю здесь это искусство🎨
Please open Telegram to view this post
VIEW IN TELEGRAM
72
😊 Розыгрыш! 😊

Разыгрываю книжку "Spark в действии", которую даже сама читала в электронном варианте😁
Готова переслать по России или лично вручить в Мск!

Нужно:
1️⃣ Быть подписанным на канал
2️⃣ Оставить коммент - напишите любое ключевое слово из sql/spark/языков программирование/airflow итд итп

Итоги будут подведены 17.06.2024

Удачи🙂
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3511
Как ПСИ проходили

🦆 Мы сейчас мигрируем витрины данных на свой кластер и перед каждым релизом проходим ПСИ.

🤓 ПСИ - это приемо-сдаточное испытание, где проверяют, а что за данные, а как, а почему, а с какой целью, а какой атрибутивный состав, а какая логика расчета и тому подобное. Что потоки с витринами успешно запускаются без падений.

👉 И вот во время созвона мы обнаруживаем, что для установки на прод не хватает release notes, которые автоматом проставляются. Т.к. это все для нас впервые, то мы не в курсах, как их быстро добавить.

🏃‍♂️ Пишу коллеге, который нам помогал по этому поводу, - не читает. Звоню(!):

- Как проставить release notes?
- Надо запустить доп. пайплайн в Jenkins
- Где его найти?
- Лежит рядом с основным (хотя бы это знаем)

Иду в Jenkins, как заполнять поля - непонятно, смотрю примеры, делаю по аналогии, запускаю - отработало!!!

👨‍🦯 Лид тайм от реагирования до исполнения: 16 минут.
ПСИ успешно пройдено.

Mic Drop
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23🏆3🤝2👻1
Что спросить на собесе?
У 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️⃣ Культура командных посиделок
Есть ли чатик с мемами?^^

🐾Есть еще что добавить?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥326💯2
Media is too big
VIEW IN TELEGRAM
🍄 Итоги розыгрыша 🍄

Кое-кому сегодня удача особенно подмигнула,
и нашим победителем становится...

Улмас Киличов ☺️☺️

Напишу, обсудим все детали.
И буду думать, что бы еще интересного замутить)

А пока всем хорошего дня и недели!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1831
🔵Колоночные базы 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 и все остальные моделируются вот так.

По терминологии так до конца и непонятно. Вроде как и те, и другие - колоночные. Но первые реляционные, а вторые - нет. Как-то так)
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥5
Вопросы на 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?
Как будешь решать нестандартную задачу?

👍 Можете порассуждать в комментах)

#собес
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥275❤‍🔥3
Вышел подкаст со мной!
Теперь я звездочка 😊
Please open Telegram to view this post
VIEW IN TELEGRAM
14🔥6❤‍🔥21
007. Надо брать и делать с Data engineer

Пообщались с Айгуль Сибгатуллиной. Сейчас Айгуль работает в Сбербанке на позиции Data Engineer.

Также ведет свой канал в телеграмм @data_engineerette.

Получился очень любопытный путь — несколько стажировок от фронтенда до бекэнда, опыт в консалтинг, потом аналитиком. И сейчас уже инженер данных.
Как так получилось? Мы обсуждали сегодня в подкасте!

👇 Слушайте, где удобно! 👇
Яндекс.Музыка
Youtube
VK

Приятного прослушивания! ❤️

#podcast
28👍116❤‍🔥11🔥1🆒1
💬Наш командный сленг

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

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

💬А у вас есть что-то, что понимаете только вы?)
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17😁122👍2🤡2👻2❤‍🔥1
Какие запросы дадут МАКСИМАЛЬНЫЙ результат?
* email уникален, в email есть null, бэктики поддерживаются
Anonymous Poll
35%
count(email)
9%
count(`email`)
14%
count('email')
11%
count("email")
16%
count(distinct email)
1%
count(distinct `email`)
4%
count(distinct 'email')
7%
count(distinct "email")
45%
count(1)
19%
count(-100)
💡Ответ 💡

count('email')
count(1)
count(-100)

☕️ Давайте разбираться

Есть табличка emails:

1 hello@gmail.com
2 null
3 null
4 hello@mail.ru


⭐️Что выведет каждый из запросов?

email == `email` == "email"
Эти три конструкции одинаковы, они обозначают само поле.
Кавычки нужны, когда название поля - это ключевое слово или когда написано на русском.

По условию email - уникальное, поэтому
count(email) == count(distinct email)

📍count не считает нуллы
Поэтому в нашем примере по всем этим 6 запросам будет ответ 2.
Ответ - 2.


🦶 Идем дальше

count('email') - здесь мы подаем на вход строку с названием 'email' (не поле!)
Т.е. на вход каунту будет так:
1 email
2 email
3 email
4 email

Мы по сути считаем количество строк.
Ответ - 4.


Аналогично для этих двух запросов:
count(1)
count(-100)
Вообще неважно, что писать в скобках, хоть '2340sdjf2фыа934!-3/'. Результат всегда - это количество строк.
1 -100
2 -100
3 -100
4 -100

Ответ - 4.


Ну и в count(distinct 'email') получается, что мы берем уникальные строки 'email'. А они везде одинаковые.
Ответ - 1.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16💯221
👩‍💻 👩‍💻Про leetcode

Неделю назад решила достать свой акк на литкоде и начать решать задачки. Потому что когда-нибудь это может пригодиться на лайв кодинге, а я уже буду без стресса и во всеоружии⭐️

🎙️Иногда бывали такие вопросы, когда накатывала внутренняя улыбка и я думала:

Ага, про это я писала в своем канале)


И хочется достичь такого же уровня:

Ага, я уже решала такую задачу и помню, как она решается


Кстати, в самом начале увидела задачку про палиндром, которую спрашивали у моего коллеги на собесе.

📖 Даже если не понадобится, то все равно это основа для моего дальнейшего развития. Я сверяюсь с залайканными решениями, изучаю возможные оптимизации по памяти/месту, запоминаю технические и логические лайфхаки.

Пока решаю простые задачки и планирую их все добить (бесплатные). Python - чтобы подумать, SQL - чтобы отдохнуть😅

А у вас как дела? Есть тут чемпионы?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍273