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

по вопросам сюда: @aigul_sea
Download Telegram
Advent of SQL. Day 10

🏰 Вот такую конструкцию я 200% ни разу не встречала и не подозревала о ней! В задаче нужно было перенести данные из таблицы1 в таблицу2 и вывести только перенесенные строчки. Но обязательно в одном запросе - эммм... а как?

Дали подсказку - использовать по максимуму возможности постгри. Что ж, по первой ссылке я нашла тред на stackoverflow

С помощью CTE и RETURNING можно возвращать вставленные/удаленные/обновленные строки и передавать их в следующий запрос. Наверное, можно навешивать несколько cte, строить цепочки таких перемещений и даже ETL из raw в витрину, но звучит как мазохизм 😁

В финальном запросе получилось так:


with moved_rows as (
delete from deliveries
where ...
returning *
)
insert into misdelivered_presents
select
*,
date_trunc('second', LOCALTIMESTAMP) as flagged_at,
'Invalid delivery location' as reason
from moved_rows
returning *


Мы из delete передаем строки в insert, а из insert выводим на экран - это мэджик какой-то 😍

🏴󠁧󠁢󠁥󠁮󠁧󠁿 Фразы дня

I'm feeling stingy - ощущаю себя скупым
inexplicably - необъяснимо
issue an edict - издать указ
meddle in - вмешиваться
muck it up - все испортить
plop - плюхнуться
sleigh is airborne - сани находятся в воздухе
volcano rim - край вулкана

📍 Advent of SQL (с впн)
📍 SQL Advent Calendar (с впн)
📍 Мои решения

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥64
Собрались как-то DeepSeek, Grok и Gemini...

Вам попадался видос, как несколько иишек играют в мафию? Я наконец посмотрела, и тут прям полноценный разбор, как каждая модель себя ведет. Кто-то более официозно, кто-то льет много воды, кто-то умеет строить хитрые планы, а кто-то не понял правила игры 😁

А на этом канале автор выкладывает игры полностью. Обязательно хочу посмотреть игры целиком и проследить, как у них проявляются персональные характеристики 😮
Please open Telegram to view this post
VIEW IN TELEGRAM
73
Advent of SQL. Days 11-14

🏂 Сначала вспомнили про скользящее среднее, его нужно было найти за 7 предыдущих дней. Для этого есть конструкция rows between:


avg(score) over (
partition by child_id order by behavior_date
rows between 6 preceding and current row
) as avg_rolling_7_days


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

Дальше задачка на полнотекстовый поиск, такого я не ожидала😁 По итогу познакомилась с несколькими функциями и операторами:

to_tsvector
to_tsquery
ts_rank
setweight
@@

Потом пошли парсить xml и считать количество зарегавшихся пассажиров. Автор использовал cross join lateral, ну а я нашла другой способ, он мне нравится больше:


cardinality(xpath('/manifest/passengers/passenger', manifest_xml)) as passengers_count


В предпоследний день искали пути от одной точки до другой и задействовали recursive cte

Ну вот и почти все! Сегодня будет последнее задание 🥲

🏴󠁧󠁢󠁥󠁮󠁧󠁿 Фразы дня

barrel straight down the hill - нестись вниз по склону
circuitous path - окольный, окружной путь
mind-bending - сложный
schlep - волочиться
winding route - извилистый маршрут

📍 Advent of SQL (с впн)
📍 SQL Advent Calendar (с впн)
📍 Мои решения

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥11
ru-RU-YearCompass-booklet-A4-fillable.pdf
524.6 KB
Подводим итоги!

➡️ Летом этого года нашла такую штуку, как "YearCompass". Это док для подведения итогов года. Там есть вопросы про предыдущий 2025 год - что произошло, какие достижения и уроки. И про наступающий 2026 - про мечты, привычки и планы

Я хочу попробовать и посидеть перед нг. Хотя не очень люблю рефлексировать, многое вообще забываю, а некоторые желания у меня повторяются из года в год с 14 лет🙂

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

❄️❄️❄️❄️❄️

Адвенты тоже закончились!🥳 В последний день нужно было объединить 2 таблички, где одна из табличек имела приоритет. Рассказали про конструкцию insert into on conflict do nothing. Я же сделала через union all, добавила новый столбец 1 as ordering и засунула в оконку:


row_number() over(partition by system_id order by dispatched_at desc, ordering)


🏴󠁧󠁢󠁥󠁮󠁧󠁿 Фразы дня

dispatch ledger - журнал отправлений
edifying - поучительный
eerie calm - жуткое спокойствие
it's a wrap - снято/все закончили
network hiccup - сетевой сбой
perfect liftoff - идеальный запуск
pumped - воодушевлен
with any luck - если повезет

Advent of SQL (с впн)
SQL Advent Calendar (с впн)
Мои решения

Ну, а я с этого момента уже в предновогоднем отпуске! Еще подготовлю отдельный пост с итогами года

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
136🔥5💅3
Мои итоги 2025 года

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

Итак, за этот год вас стало в 2 раза больше! Надеялась, что до нг наберем 3к, но так уж и быть, добъем в следующем году!

Пробежимся по основым циферкам:

🌲 30102 музыкальные минуты
🌲 1278 выполненных личных задач
🌲 210 часов в поездах
🌲 85 культурно-развлекательных мероприятий
🌲 65 закрытых рабочих задач
🌲 53 посещения врачей
🌲 25 просмотренных фильмов и сериалов
🌲 20 митапов
🌲 19 поездок
🌲 7 прочитанных книг
🌲 6 городов
🌲 2 пройденных курса
🌲 1 проведенный вебинар

Хотелось бы отдельно отметить пункт про вебинар - это был мой первый публичный спич на такую аудиторию, и все прошло блестяще!

а еще:

🏡 перешла из Сбера в Ламоду и благодарна как прошлым тиммейтам, так и действующим
🌸 прошла курс по управлению командой и заложила ростки для будущего
☕️ съездила на смартдату и хорошенько понетворкалась

По традиции сделала подборочку постов:

😎 Топовые
Как я стала lamodian
Стата по моим офферам
Как хранятся айсберг таблицы
Мелкие файлы на практике

🙂 Мемные
Когда тимлид смотрит твои сторис
Хокку про DE

🥰 Сложные
Газлайтинг движков
Sort-Merge Join без шафла
Коммитеры в Spark
Preemption в YARN

По подписчикам для мерча пришел всего 21 человек, но они расщедрились и решили 2-3 места тоже наградить мини-наборами, так что я в плюсе! Спасибо всем, кто откликнулся❤️

Прошлогодний обзор можно посмотреть тут

❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️

А я поздравляю вас всех с наступающим новым годом! 🥳 Пусть каждое дело завершается со статусом success, здоровье backfill-ится за предыдущие периоды, доходы растут как в SummingMergeTree, а partitioning помогает отделять важное от суеты! И пусть даже самый сложный путь к цели сократится до O(1)!🎄

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
27🎄14👍84🤔1
Новые требования к кандидатам в 2026?

Мне периодически пишут hr и иногда я отвечаю, чтобы быть в курсе текущих трендов на рынке. Из последних новостей - рекрутинговая компания пошла согласовывать резюме с компанией-заказчиком, но они требуют не меньше двух лет на последнем месте

А недавно моему знакомому разрабу после хорошего собеса отказали в оффере, потому что не было диплома о высшем образовании

Получается, перейти все сложнее, войти еще сложнее, а попасть под волну сокращения проще простого?
16😁7😭43🤔2
Баг/фича в DBeaver

Вы когда-нибудь пробовали заполнить поле с датой значением 9999-12-31 23:59:59.000 +0300? Если зайти в настройки и поменять на таймзону дальше мск, то мы будем уже в 10000м году

Даже есть такая штука, как Y10K problem - проблема 10000го года. ПО может поломаться, поля переполниться, поэтому люди задумываются уже сейчас о введении дополнительного нуля, чтобы различать 02025 и 12025

А еще ближе становится Y2038 problem. Тогда unix timestamp перестанет помещаться в int, и 2038 год превратится снова в 1901. Поэтому в этом случае пора переходить на bigint, пока не поздно

@data_enigineerette
🤔23🔥10🌚4👍21
Кастомизируем Spark UI

Когда работают джобки в спарк приложении, мы обычно видим только техническое описание. Но есть возможность написать что-то читаемое:


spark.sparkContext.setJobDenoscription(s"Merge into ${schema}.${table}")

spark.sql(mysql)

spark.sparkContext.setJobDenoscription("Count deleted rows")

df.filter(col("is_deleted") === true).count()


Если не менять описание, то все экшены будут подтягивать последнее

Вернуть к дефолтным можно так:


spark.sparkContext.setJobDenoscription(None)


На вкладке SQL все это тоже отображается

@data_engineerette
👍20
Удаляем дубли в ClickHouse без ReplacingMergeTree

У меня была задачка настроить создание табличек через фреймворк. И вот настал момент - локально все работает, доступ к кх я получила, джобку доделана. Пора тестить!

💻 Сначала я решила покрутить запросы ручками, проверить права на создание табличек, все ли работает. Создаю на движке MergeTree, пишу данные - все ок. Перехожу к ReplicatedMergeTree - создаю табличку, вставляю пару строк данных, делаю select...


CREATE TABLE db.test_table_local ON CLUSTER '{cluster}'
(
`id` UInt32,
`name` String
)
ENGINE = ReplicatedMergeTree
ORDER BY id;

INSERT INTO db.test_table_local
VALUES (1, 'test');
INSERT INTO db.test_table_local
VALUES (1, 'test');

SELECT * FROM db.test_table_local;


Нет, что-то не то. Я вставила 2 строки, но вижу одну. Почему? В табличке всего 2 поля, что пошло не так?

😑 Иду искать проблему. Попробовала вставить еще раз и еще раз, посмотрела в system.parts на незавершенные мутации, сделала SYSTEM SYNC REPLICA, но ничего не помогло

Потом я поняла, что удаляются дубликаты для записей с одним первичным ключом. Но в кх же нет такой строгости? Что-то не сходится

Нахожу в доке по кх:


Для движков *ReplicatedMergeTree дедупликация вставок включена по умолчанию и управляется настройками replicated_deduplication_window и replicated_deduplication_window_seconds. Для нереплицируемых движков *MergeTree дедупликация управляется настройкой non_replicated_deduplication_window.


Иду в табличку смотреть эти настройки:


SELECT * FROM system.merge_tree_settings
WHERE name LIKE '%deduplicat%';


Из основных настроек вижу:

📌non_replicated_deduplication_window = 0, поэтому в MergeTree данные вставляются как обычно
📌replicated_deduplication_window != 0, дубликаты не вставляются, они проверяются по хэш-суммам для определенного количества свежих блоков (по дефолту 10к), хэши лежат в Zookeeper
📌replicated_deduplication_window_seconds - сколько секунд хранятся эти хэш-суммы (по дефолту 3600с = 1ч)

Я со своей задублированной строкой попала сразу в 2 настройки. До этого не замечала такого поведения в кх, хотя это дефолтное🤷‍♂️ Зато узнала про существование таблицы system.merge_tree_settings

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
116👍82