TGViewer
Channel Public Channel
дата инженеретта

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

@data_engineerette

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

по вопросам сюда: @aigul_sea
Subscribers
3.43K
Photos
297
Videos
28
Links
128

Showing posts older than #544 · Back to latest

Older Posts 13 shown
Post #543 2.83K
IPv4 vs IPv6

👀 Я раньше очень часто смотрела на таблицу с событиями пользователей из яндекс метрики. Там были столбцы ClientIP и ClientIP6:

ClientIP - IPv4 с которого было установлено TCP соединение с сервером

ClientIP6 - IPv6 с которого было установлено TCP соединение с сервером

Причем ClientIP6 никогда не было заполнено. И я все время задумывалась: а что там вообще должно лежать?

👩‍💻 И вот недавно я собиралась поиграть с европейскими ребятками. Они подняли свой собственный сервер, чтобы пинг был меньше. Скинули мне примерно такую ссылочку:

http://[2a02:8071:78f1:e662:416d:f389:ff96:442e]:8080/

Я в первый раз увидела, что такое IPv6 на самом деле)

Оказалось, что на их стороне роутером не поддерживается IPv4, а на моей стороне провайдером не поддерживается IPv6

🌎Нашла интересную карту, где показано, что в США, Европе показатель доступности около 60%, Саудовская Аравия и Индия под 80%, пока у нас всего 3%. Представляете?
https://stats.labs.apnic.net/ipv6/

Google показывает 9%, но складывается примерно такая же картина:
https://www.google.com/intl/en/ipv6/statistics.html

@data_engineerette
  • 😭 14
  • 👍 7
  • ❤ 2
Post #537 2.58K

Forwarded from БАШНЯ

HARD SKILLS🫥

Сегодня разбираем реальный кейс о том, как один файл и смена инфраструктуры положили Nexus и остановили релизы👩‍💻

Делитесь этим постом с друзьями и пишите свои вопросы в комментарии ✍️

Автор поста: @data_engineerette

#hardskills
  • ❤ 19
  • 👍 13
  • 😭 1
Post #536 2.21K
Поделилась тут интересной историей🤗
Post #535 2.9K
Замена show partitions

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

1️⃣ max(date) - самое ресурсозатратное, потому что нужно пробежаться по всей таблице

2️⃣ show partitions - отличный способ, пробегаемся только по метаданным

Другие 2 варианта подойдут для айсберга:

3️⃣ raw.my_table.partitions - в айсберге есть много системных мета-таблиц, таблица с партициями выглядит так:


-RECORD 0-------------------------------------------
partition | {2025-03-29 00:00:00}
spec_id | 0
record_count | 7251
file_count | 1
total_data_file_size_in_bytes | 91062
position_delete_record_count | 0
position_delete_file_count | 0
equality_delete_record_count | 0
equality_delete_file_count | 0
last_updated_at | 2025-11-20 12:25:48.678
last_updated_snapshot_id | 5910543042911865752
only showing top 1 row


Это как аналог show partitions: идем в табличку и отбираем max(partition)

4️⃣ TBLPROPERTIES - тут обсудим подробнее

Пусть таблица партицируется по другим полям или не партицируется вообще. Тогда в момент загрузки можно проставить любое свойство:


ALTER TABLE raw.my_table
SET TBLPROPERTIES ('raw.last-date' = '2025-12-05');


Их может быть несколько, посмотрим на текущий список:


SHOW TBLPROPERTIES raw.my_table


Сюда добавилось наше кастомное свойство:


+-------------------------------+-----------------+
|key |value |
+-------------------------------+-----------------+
|current-snapshot-id |63675018113182479|
|format |iceberg/PARQUET |
|format-version |2 |
|raw.last-date |2025-12-05 |
|write.format.default |PARQUET |
|write.parquet.compression-codec|zstd |
+-------------------------------+-----------------+


Убрать свойство можно так:


ALTER TABLE raw.my_table
UNSET TBLPROPERTIES('raw.last-date');


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

@data_engineerette
  • 👍 7
Post #532 2.95K
Двойные эмоциональные качели

Эта история случилась, которая я устраивалась в Сбер. И до сих пор только избранные знали, как это произошло на самом деле)

🐌 Я параллельно общалась с двумя компаниями: первая удаленно (Mediascope), вторая в мск (Сбер)

Особенности первой позиции: удаленно, зп в 2 раза больше, да на стыке с де, есть ночные дежурства, после которых можно начать попозже

Особенности второй позиции: надо переезжать, зп в 3 раза больше, крутой вайб с лидом, чисто де задачи. Что меня больше всего впечатлило - лид попросил глянуть тестовое и самой написать, сколько времени понадобится на выполнение. Почему-то этот момент попал мне в самое сердечко💖

Мне очень понравилась вторая позиция, но было сильно давление сверху от мамы. Типо вот так возьму и оставлю ее одну...

🧐 Именно тогда я вступила датаинженерские чатики, чтобы поспрашивать, стоит ли переезжать, сколько стоило просить, как работается. Нашла похожий вопрос на хабре Q&A и написала автору на почту. Писала людям на линкедине из этих компаний, спрашивала про общее ощущение, про задачи. Даже нашла девчонку, которая до этого работала в моей текущей команде и увольнялась по тем же причинам, что и я))

В общем, скрепя сердце я приняла свою долю, отказала сберу и решила согласиться на удаленку в предстоящем вечернем созвоне. Но мне воткнули нож в спину, еще вчера они переманивали к себе, а уже сегодня выбрасывают на улицу🥲 Ничего не оставалось, как попытаться стереть память hr

🏃‍♂️А дальше я уволилась, в тот же вечер села в поезд, с утра приехала в мск, съемной квартиры еще нет, оставила чемоданы и сумки на вокзале, на улице снег и минусовая температура, в пальто и демисезонных сапогах очень холодно, оформилась только к вечеру, успела на ежеквартальный фуршет...

А там мне сказали: "Мы тебя так ждали"💖

Happy end🎉

P.S. Мои переписки в датаинженерских чатиках, сомнения в переезде и обсуждения зп читал мой будущий лид. Я видела наши общие каналы, но понадеялась, что нормальные люди не мониторят там сутками) Спустя полгода сидя в ресторанчике, он мне все это рассказал👀 И что они в команде это тоже обсуждали. Я готова была провалиться сквозь землю

@data_engineerette
  • ❤ 56
  • 🤔 1
Post #531 2.85K
Удаляем дубли в 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
  • 👍 8
  • ❤ 2
Post #530 2.44K
Кастомизируем Spark UI

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


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

spark.sql(mysql)

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

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


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

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


spark.sparkContext.setJobDescription(None)


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

@data_engineerette
  • 👍 23
  • 🔥 2
Post #529 2.83K
Баг/фича в 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
  • 🌚 5
  • 👍 2
  • ❤ 1
Post #527 2.94K
Новые требования к кандидатам в 2026?

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

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

Получается, перейти все сложнее, войти еще сложнее, а попасть под волну сокращения проще простого?
  • ❤ 17
  • 😁 7
  • 😭 5
  • 🤔 2
Post #524 3.82K
Мои итоги 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
  • 🎄 15
  • 👍 8
  • ❤ 5
  • 🤔 1
Post #523 2.9K
ru-RU-YearCompass-booklet-A4-fillable.pdf524.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
  • ❤ 13
  • 🔥 5
  • 💅 3
Post #522 2.13K
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
Telegram дата инженеретта rows between Когда я в декабре решала Advent of SQL, на 11 день было интересное задание - найти скользящее среднее по текущей строке с двумя предыдущими. Еще похожая штука применяется, когда нужно найти кумулятивную сумму 🚃 Выход - оконка! (но только в…
  • ❤ 5
  • 🔥 1
Post #521 2.2K
Собрались как-то DeepSeek, Grok и Gemini...

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

А на этом канале автор выкладывает игры полностью. Обязательно хочу посмотреть игры целиком и проследить, как у них проявляются персональные характеристики 😮
  • ❤ 3
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →