💡Ответ💡
В комментах предложили навесить функциональный индекс. Выглядит как то, что нужно.
❔ Что это?
Это такой индекс, в котором ключи посчитаны через функцию.
😎 Решение №1
Никогда его не использовала, но для нашего случая будет по типу:
Делаем 'concat like входная строка' - применяется наш индекс.
👉 Решение №2
Если мы не можем создать индекс, идея такая:
1. Разделить поисковую строку по /
2. Три случая:
▪️ 1 элемент - день, месяц или год
▪️ 2 элемента - либо день и год, либо месяц и день
▪️ 3 элемента
В комментах предложили навесить функциональный индекс. Выглядит как то, что нужно.
Это такой индекс, в котором ключи посчитаны через функцию.
Никогда его не использовала, но для нашего случая будет по типу:
CREATE INDEX us_date_idx ON my_table (concat_ws('/', month(dt), day(dt), year(dt)))Делаем 'concat like входная строка' - применяется наш индекс.
Если мы не можем создать индекс, идея такая:
1. Разделить поисковую строку по /
2. Три случая:
like '%elem1%'
--день и год
--1/2 - это конец дня и начало года
like 'year%day'
--месяц и день
--1/2 - это конец месяца и начало дня
like '-%month-day%'
--1/29/202 - месяц и год могут быть недописаны
like 'year%-%month-day'
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
dbt_deep_dive.pdf
1.6 MB
У нас в команде есть история с deep dive. Мы выбираем тему, собираем все наши знания и задачи, раскапываем всё. Потом делаем презу и просвещаем коллег.
Эта преза моего дип дайва по dbt. Там рассказывается:
А вы какие фишки используете?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥34❤6💯5👌2⚡1
Как заруинить джойн в спарке?
С помощью udf!
🧐 Что это?
UDF (user defined function) - это функция, которую мы сами написали и можем применить в спарке (и не только).
🤩 Пример
Самый обычный джойн:
План запроса - стандартный SortMerge (без деталей):
😭 Перепишем запрос через udf:
И все - теперь у нас под капотом декартово произведение:
👀 А все потому, что для спарка udf - это черный ящик, и он не будет заглядывать вовнутрь. Так что схема такая:
#spark
С помощью udf!
UDF (user defined function) - это функция, которую мы сами написали и можем применить в спарке (и не только).
Самый обычный джойн:
df1.join(df2, ['id'], 'inner')
План запроса - стандартный SortMerge (без деталей):
== Physical Plan ==
+- Project
+- SortMergeJoin
:- Sort
: +- Exchange hashpartitioning
: +- Filter isnotnull
: +- Scan ExistingRDD
+- Sort ...
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
SortMerge -> Cartesian
ShuffledHash -> Cartesian
BroadcastHash -> BroadcastNestedLoop#spark
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15 9❤5⚡1👍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. А Хотелось компактно организовать
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)
Тоже с условиями слишком громоздко
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❤🔥4 4❤1
Есть идея крутой активности!
Поделитесь, кто где обитает)
Поделитесь, кто где обитает)
Anonymous Poll
41%
Москва
12%
Санкт-Петербург
6%
Казань
5%
Екатеринбург
1%
Краснодар
3%
Новосибирск
2%
Красноярск
18%
За рубежом
13%
Другое (в комментах)
появились в версии 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
Getdbt
Unit tests | dbt Developer Hub
Implement unit tests to validate your dbt code.
🔥8❤1
Обработка больших данных
Представьте, что у вас есть огромная таблица. Она накапливает по миллиарду строк на каждый день. И вам нужно вытащить агрегаты за последние полгода.
Если считать в лоб, то надо пройтись по ~ 1 млрд * 6 месяцев * 30 дней = 180 млрд строк🔥
Вы запустили запрос, все зависло, кластер упал, оборудование перегрелось, дата центр сгорел - вас уволили и заставили влезть в кредиты😱 😱 😬 😬 ну, или нет)
❔ Что делать?
Такие таблицы обычно считаются по дням. Посчитали день - положили в датафрейм. Потом новый кусок объединили с предыдущими.
Или так: посчитали - сохранили в таблицу. И каждый новый день по очереди дописывается.
❕ Поэтому семь раз режем, один раз мерим.✂️
Представьте, что у вас есть огромная таблица. Она накапливает по миллиарду строк на каждый день. И вам нужно вытащить агрегаты за последние полгода.
Если считать в лоб, то надо пройтись по ~ 1 млрд * 6 месяцев * 30 дней = 180 млрд строк
Вы запустили запрос, все зависло, кластер упал, оборудование перегрелось, дата центр сгорел - вас уволили и заставили влезть в кредиты
Такие таблицы обычно считаются по дням. Посчитали день - положили в датафрейм. Потом новый кусок объединили с предыдущими.
Или так: посчитали - сохранили в таблицу. И каждый новый день по очереди дописывается.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21👏5 1
DESCRIBE FORMATTED
Посмотреть пути партиций в hdfs можно командой:
И после получения локации мы можем считать файл в датафрейм:
#spark
Посмотреть пути партиций в 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
Разыгрываю книжку "Spark в действии", которую даже сама читала в электронном варианте
Готова переслать по России или лично вручить в Мск!
Нужно:
Итоги будут подведены 17.06.2024
Удачи🙂
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥35 11
Как ПСИ проходили
🦆 Мы сейчас мигрируем витрины данных на свой кластер и перед каждым релизом проходим ПСИ.
🤓 ПСИ - это приемо-сдаточное испытание, где проверяют, а что за данные, а как, а почему, а с какой целью, а какой атрибутивный состав, а какая логика расчета и тому подобное. Что потоки с витринами успешно запускаются без падений.
👉 И вот во время созвона мы обнаруживаем, что для установки на прод не хватает release notes, которые автоматом проставляются. Т.к. это все для нас впервые, то мы не в курсах, как их быстро добавить.
🏃♂️ Пишу коллеге, который нам помогал по этому поводу, - не читает. Звоню(!):
- Как проставить release notes?
- Надо запустить доп. пайплайн в Jenkins
- Где его найти?
- Лежит рядом с основным (хотя бы это знаем)
Иду в Jenkins, как заполнять поля - непонятно, смотрю примеры, делаю по аналогии, запускаю - отработало!!!
👨🦯 Лид тайм от реагирования до исполнения: 16 минут.
ПСИ успешно пройдено.
Mic Drop
- Как проставить release notes?
- Надо запустить доп. пайплайн в Jenkins
- Где его найти?
- Лежит рядом с основным (хотя бы это знаем)
Иду в Jenkins, как заполнять поля - непонятно, смотрю примеры, делаю по аналогии, запускаю - отработало!!!
ПСИ успешно пройдено.
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️⃣ Культура командных посиделок
Есть ли чатик с мемами?^^
🐾 Есть еще что добавить?
У HR, команды и руководителя.
Недавно общались с коллегами и накидали свой список, что бы мы спросили/что обычно спрашивают:
Условия согласования
Обязательно ли с 9 до 18 или можно двигать, дорабатывать попозже
Как вам доставят?
Есть ли офис в вашем городе?
Команда может укомплектовываться, но может и разваливаться
Сколько человек?
Сколько дата инженеров/аналитиков, других ролей?
Разбивка по джунам/мидлам/сеньорам?
Кто лидит в команде: техлид, тимлид, продукт оунер?
Кто делает code review?
Скорее всего, к этому моменту вам уже все рассказали
Канбан означает, что команда типо сервисная, много ad hoc-ов
Есть ли Jira, Confluence или что-то подобное?
Если нет, то придется вам копаться в документации и общаться с заказчиками
От кого ТЗ?
Аналитики, бизнес, другие подразделения
Какие задачи?
Бывают ли переработки?
Как расти в компании?
Проводится ли ретро?
Глобальное демо на несколько команд? (например, раз в квартал)
Есть ли чатик с мемами?^^
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32 6💯2
Media is too big
VIEW IN TELEGRAM
Кое-кому сегодня удача особенно подмигнула,
и нашим победителем становится...
Улмас Киличов
Напишу, обсудим все детали.
И буду думать, что бы еще интересного замутить)
А пока всем хорошего дня и недели!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18 3❤1
У нас закупаются корпоративные курсы, и я сейчас прохожу очередной по де) До этого не сталкивалась с семейством колонок, везде пишут по-разному, так что держите ликбез
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.
Тут статейка очень старенькая, но есть полезности.
По терминологии так до конца и непонятно. Вроде как и те, и другие - колоночные. Но первые реляционные, а вторые - нет. Как-то так)
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?
Как будешь решать нестандартную задачу?
👍 Можете порассуждать в комментах)
#собес
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
🔥27❤5❤🔥3
Вышел подкаст со мной!
Теперь я звездочка😊
Теперь я звездочка
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from IT-минималист | Аналитик данных с нуля (Daniil Kukushkin)
007. Надо брать и делать с Data engineer
Пообщались с Айгуль Сибгатуллиной. Сейчас Айгуль работает в Сбербанке на позиции Data Engineer.
Также ведет свой канал в телеграмм @data_engineerette.
Получился очень любопытный путь — несколько стажировок от фронтенда до бекэнда, опыт в консалтинг, потом аналитиком. И сейчас уже инженер данных.
Как так получилось? Мы обсуждали сегодня в подкасте!
👇 Слушайте, где удобно! 👇
Яндекс.Музыка
Youtube
VK
Приятного прослушивания! ❤️
#podcast
Пообщались с Айгуль Сибгатуллиной. Сейчас Айгуль работает в Сбербанке на позиции Data Engineer.
Также ведет свой канал в телеграмм @data_engineerette.
Получился очень любопытный путь — несколько стажировок от фронтенда до бекэнда, опыт в консалтинг, потом аналитиком. И сейчас уже инженер данных.
Как так получилось? Мы обсуждали сегодня в подкасте!
👇 Слушайте, где удобно! 👇
Яндекс.Музыка
Youtube
VK
Приятного прослушивания! ❤️
#podcast
❤28👍11 6❤🔥1⚡1🔥1🆒1
Просто захотелось записать крутые словечки, которые мы используем внутри команды) Некоторые могут быть общепринятыми, но мы с коллегами постарались накидать своих особенных:
aboba - почти дефолтный нейминг всяких тестовых табличек, файликов, переменных
Багулина - баг
Базёнка - база данных
Биг боссы - руководители
Грядка - ряд рабочих мест
Джирафлоу - перемещение задачек по статусам в джире
Дикий интернет - интернет нормального человека
Дип дайв - образовательная техническая встреча, где кто-то из коллег рассказывает про крутые штуки
Дорогие коллеги - устойчивое выражение по отношению к коллегам
Жира - джира
ЗНОпс (запрос на обслуживание) - история с заведением заявок, получением согласований
Каминг-аут - релиз
Кодулина/эскуэлина - кусочек кода
kutuza moment - когда мы переехали с кутузы в другой офис, все казалось непривычным: мыло само не льется, вода сама не включается. это выражение описывает такие моменты, когда ты стоишь ждешь мыла или забыл выключить кран
Миграция/интеграция с хх - когда коллега собирается уйти
Ореховая леди - женщина, которая с утра раскладывает орешки
Особый стендап - прощальный стендап
Падаван - джун
Плов - Airflow
Пользак - пользователь
Проблема будущих нас - как Скарлетт, которая подумает обо всем завтра
Синк - встреча нескольких команд, чтобы обсудить статусы
Скам мастер - скрам мастер
Смотритель зоопарка, сопровод - сопровождение
С улицы - когда коллега пришел не из Сбера
Технина - у нас был коллега, который работал в яндексе. там у них проводились техтолики (типо techtalk). и я как-то предложила для Толика придумать даму сердца - Нину. теперь у нас есть технина))
Трубочист - девопсер
Узя - Oozie
Улучшайзинг - процесс улучшения
Фактура, собрать фактуру - поресерчить, прийти с конкретными кейсами и вопросами
Хабуп - Hadoop
Хадуповоды - название нашего чатика, где мы решаем проблемы с кластером
Хомяк - папка /home
Человек-джоба - когда ручками запускаешь то, что можно автоматизировать
Ярн киллер, придет ярн киллер - одно из требований безы к витринкам - если они падают, то должен быть процесс, который придет и убьет поток. и наоборот - если поток падает, процесс приходит и убивает расчет витринки
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17😁12❤2👍2🤡2👻2❤🔥1
Кидаю ссылочку на буст канала
Пишите свои пожелания по реакциям)
https://news.1rj.ru/str/boost/data_engineerette
Пишите свои пожелания по реакциям)
https://news.1rj.ru/str/boost/data_engineerette
Telegram
дата инженеретта
Проголосуйте за канал, чтобы он получил больше возможностей.
❤3🔥2 2 2💯1 1