it пингвин | data engineer – Telegram
it пингвин | data engineer
1.79K subscribers
52 photos
10 videos
2 files
63 links
Канал главного разработчика Data Lake крупного банка.
База знаний для джунов, разбор собесов, задачи (jun/mid/sen) с решениями, полезные материалы, обзоры технологий и архитектур.

По вопросам и менторству писать @it_pengwin
Download Telegram
Очередная испыталка пройдена

На следующей недели сделаю пост о том, что для меня самое сложное в новой компании. Я работал в телекоме, банках и сейчас в ритейле, сравню их.
Времени сейчас мало, на работе завал 🥲

Насыпьте реакций плз, если интересно⬇️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥912615👍83🥰2🎉2😭1
This media is not supported in your browser
VIEW IN TELEGRAM
У кого тоже не коллеги, а семья?😄
😁235🤣3😭22
Новая работа 👨‍💻

Итак, у меня закончилась испыталка в X5

Я работаю в отдельном от большого X5 хранилище. Технологий пока что не так много, но мы очень активно развиваемся.

Если кратко, архитектура у нас сейчас такая:
Основной источник - наш бэк на MongoDB. С помощью самописного CDC инструмента пишутся данные в Кафку.
Стриминг - читаем из кафки и пишем в обычную Постгрю. Скоро будет Кликхаус.
Батчинг - Nifi читаем из Кафки, пишем Greenplum. Модель данных у нас Data Vault. Трансформации на DBT. DBT модельки (и не только) запускаются через Airflow.
Также есть Minio. Здесь чуть подробнее описал.

Планируем разворачивать модные Айсберги, Трино, duckdb, Spark Streaming/Flink и тп.

Я много с чем не работал вообще, или не так глубоко.
Был удивлен, что самая сложная "технология" для меня в новой компании - это Data Vault
Очень сложно и непривычно организованы таблицы. Проблематичны поиск данных, понимание как джоинить таблицы, построение dds, промежуточных моделек и тп.
С остальными технологиями полегче.

Что еще непривычно в новой компании - темп работы. Очень много разнообразных задач. Лид очень круто руководит процессом. Задачки сыпятся как конвейер - доделываешь задачи, на подходе сразу много новых.
Вроде как и не перерабатываю, но постоянно какой-то напряг. Не получается почилить как в банке. И начал прям заниматься за тайм менеджментом. Выбираю какие задачки в первую очередь делать, что можно делать параллельно. Декомпозирую задачи и связываю разные задачки. Опять же в банке у меня было совсем по-другому) Плюс так вышло, что на меня повесили достаточно сложный проект, за которым следили наши топы. И хорошо, что мне очень помогала коллега.

Но мне пока что этот высокий темп - нравится. Я вроде бы не говорил, но я получил несколько офферов. И выбирал между газпромбанком и х5. В гпб был жирнее оффер. Но мне уже надоела эта банковская бюрократия. Хотелось больше суеты 😁
Выбрал х5 и не жалею.

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

* как раз недавно прочитал репост у Lost in Data с канала This is Data.
Понравилась классная цитата
быть самым слабым в команде – не стыдно. Стыдно – застрять там, где ты не развиваешься.


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

Основные заказчики для нас - всякие разные аналитики. И тоже хочу отметить работу с ними. Я плотно общался где - то с 4 аналитиками. И все были очень вайбовые.
Я могу написать аналитику много кода, технических штук - он мне говорит, добавь плз больше русских слов)
И наоборот аналитики мне объясняют всякие бизнесовые приколы, метрики и для чего им нужны новые данные/доработки.

Что еще из плюсов назвать. Работаю просто через впн, со своего пк, без всяких виртуалок. Выдали MacBook Pro 16 M2, вроде можно потом выцепить м4.
Можно договориться на удобное время работы. Коллеги живут в разных городах РФ. Один админ работает из Тайланда.

Надо что-нибудь назвать из минусов, а то выглядит как рекламная интеграция 😅

Погружение - не прям провели меня за ручку и все подробно описывали.
Документация не супер подробная, но у меня до сих руки не дошли до вики и я ее нормально не изучил.
Видосики, курсики внутри х5 - такое себе.
По самой работе, пока что все равно пишу в основном sql код. Хочется побольше питончика и инфраструктурных задач.

А так вроде бы все сказал. Кажется, что в этой компании я надолго.


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

Как вам обзорчик? Пишите свои мысли, где вы работаете, где вам нравится или нравилось раньше ⬇️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥802312👍9🎉4😭1
Закончил курс по DE от NewProLab


В начале декабря закончился курс. Кратко расскажу какие еще были лабы и дальше общее мнение по курсу.
Прошлый обзор лаб

Лаба5: Сервис персонализации интернет-магазина

Загрузка данных в клик -> рассчитываем данные-> сохраняем в Redis c помощью Airflow и вспомогательных справочников в Postgres

По-моему это самая сложная лаба и больше половины студентов ее не решили. Самое сложное не поднять сервисы, связать все, скачать данные и тд. А написать несколько хитрых SQL запросов! Здесь нужна та самая рекурсия 🥲 Надо собрать многоуровненое дерево категорий и потом к нему обращаться. И дерево может быть с косяками, с несколькими родителями..
И до всего этого реально сложно догадаться. Какие-то около олимпиадные задачки. И честно именно это мне не очень понравилось. То есть я понимал, что нужно многоо времени потратить чтоб все сделать. А желания особого не было. Таких бизнесовых задач мне и на работе хватает, а на курсе я больше всего хотел потрогать инструменты.
Но опять же, кураторы и говорили что это сложная лаба. Там дальше еще и суперачивка.. Без подробностей, просто нужно еще более сложные sql запросы написать.
Я эти лабы выполнил😎 НО с хитростями💅 Чекер проверил данные, все сошлось. Но как я этого добился история умалчивает. Мне кажется я даже более сложную работу проделал, чем написать эти хитрые sql запросы. Наверное я эти лабы выполнял ~30 часов. Запомнится мне это надолго)
При решении этой лабы очень много работал с командной строкой, редисом, Аирфлоу.

Лаба6: Сам себе CI/CD

В лабе нужно было собрать свой Docker-образ Airflow с вашим DAG внутри (через Dockerfile: зависимости + копирование дага/конфигов), чтобы пайплайн был «запечён» в образ и версионировался вместе с ним.​
Потом - настроить GitHub Actions, чтобы автоматически билдить этот образ на GitHub и пушить в Docker Hub.​
Дальше - обновить docker-compose.yml, чтобы он тянул опубликованные образы, добавить README с инструкцией запуска/создания пользователей и выложить всё в приватный репозиторий, дав доступ ментору/координатору
В целом классная лаба.

Лаба7: Расчёт данных при помощи DBT

Нужно было установить dbt-core с адаптером для ClickHouse, инициализировать dbt‑проект и настроить подключение (profiles.yml/переменные окружения), чтобы dbt debug проходил успешно.​
Дальше - в ClickHouse создать таблицы, читающие CSV из S3, и через dbt выстроить преобразования по слоям RAW -> CORE -> DM (в RAW добавить служебные поля src и created_dttm, в CORE/DM сделать требуемые расчёты и витрины).
В конце - запустить dbt run с переменной run_date (чтобы она попала в витрины) и прогнать чекер, который сверяет результат по хэш-суммам целевых DM-таблиц.

Тоже классная лаба, давно хотел сам поднять дбт, но руки не доходили. Почему-то hash суммы не сходились и по итогу тоже долго просидел над sql запросом🤦‍♂️


Лаба8: Дашборд для e-commerce кликстрима

Это лаба по сути - дипломная работа. Нужно поделиться на команды, выбрать стек технологий, поднять всю инфру, построить dwh, обработку данных, должна быть историчность и возможность делать пересчет, построить графики в биайке и проанализировать данные, все опубликовать и описать в гите. Этот проект сделали 10 человек (4 команды). Они потом выступали с защитой. Ребята проделали реально большую работу.
Я к сожалению поздно спохватился, где-то за неделю до сдачи. Другие команды уже собрались почти за месяц до сдачи. В общем, я не нашел команду и эту лабу не сдал 🥺
Я сделал все лабы, с суперачивками и знал что уже получу красный диплом. Поэтому делать лабу в соло уже не хотел.

По итогу, да. Я получил Красный диплом. ХЗ зачем, сам себе поставил и задачу и хотел этого добиться. Хотя это вообще необязательно было. Какой-то синдром отличника 🤡 Вошел в топ 7. Как раз до первых ребят не хватило выполненной 8 лабы.
И половину лекций до сих пор я не посмотрел. Круто, что доступ к гиту и лекциям остается у нас. Я в спокойном темпе все посмотрю. Лекции мне прям нравились.

Продолжение ⬇️
Please open Telegram to view this post
VIEW IN TELEGRAM
14🔥6👍53💅2
Итог
Курс топ. К сожалению не смог выделять много времени курсу, как это рекомендовалось. Много лаб делал с гпт, где-то хитрил. Но много знаний получил и точно апнулся в скилах.
Я другие курсы не проходил, но думаю мало кто им конкурент. Мне кажется им маркетинга не хватает, курс можно получше раскрутить🙂
Специалисты крутые, некоторых я и раньше знал. Лекции интересные. Лабы интересные и сложные. Иногда, как мне кажется, излишне сложные..
Координаторы в тг всегда отвечают и помогают. Я еще думал, что 2 месяца это мало и такой курс можно на 3 месяца растянуть и проходить в более комфортных условиях.. Но наверное, все-таки 2 месяц это верное решение.
Еще не хватило какого-то торжественного завершения чтоли. Я через 5 дней узнал что курс уже завершен и сертификат у меня лежит в личном кабинете.

В общем, курс Data Engineer от New Professions Lab - пингвин рекомендует 👍
Пусть этот будет как знак качества😅 Ни с кем посты я не согласовывал и писал реальное мнение.
🔥3287👍41🎉1🤣1
Багуля

Недавно нашли косяк в загрузке продовой витрины в Greenplum.

В чем суть - есть большая витрина, собирается из большой dbt модельки (внутри просто sql скрипт). И заметили, что много данных не прогружается. Я начал копаться в скрипте и заметил дурацкую ошибку - в where было условие на вхождение поля в определенный список значений и при перечислении значений была пропущена запятая. И что меня удивило - такой код работал, ошибку не выкидывал.

Вот пример. Должно было быть так:

with test as (
select 1 as code, 'one' as name union all
select 2 as code, 'two' as name union all
select 3 as code, 'three' as name union all
select 4 as code, 'four' as name union all
select 5 as code, 'five' as name
)
select * from test
where name in (
'one',
'two',
'three'
);



Но была пропущена запятая

where name in (
'one' -- нет запятой!
'two',
'three'
);


И такой код отрабатывал без ошибок. По сути GP (тестил в новой постгре, работает также) просто соединяет 'one' и 'two' в одну строку и получается 'onetwo'.

То есть такой код тоже правильно отработает
where name in (
'o'
'ne',
'two',
'three'
);`


Можно вообще все запятые убрать и все значения просто преобразуются в одну большую строку.

Позже почитал, это конечно же не баг СУБД, а особенность стандарта SQL (string literal concatenation). PostgreSQL и Greenplum специально так реализованы.

Вроде очень банальная ошибка, но вдруг кто-то тоже это не знал, решил рассказать на всякий случай 🤝
👍43🔥22🤔743
Еще одна история о потери данных ✍️

Прилетела задача от аналитика - сделайте витрину, вот вам готовый запрос.
В запросе не очень сложный расчет, но там джоинится несколько больших витрин. А мы стараемся не создавать витрину из витрин.
Поэтому мне надо было повторить запрос аналитика, но из таблиц в ядре (слой dds). Тоже все это не очень сложно, переделал запрос, вроде сходится.

Подготовил тестовую витрину в песочке для аналитика, чтоб сверил данные из своего запроса. Все ок - сходится.
Сделал MR (merge request), внедрили обновление в прод. Смотрим данные в новой витрине, что-то не так.. Небольшой процент данных не сходится с данными из тестовых запросов..

И вот начинается суета на пару дней 😔 Снова проверяю запрос аналитика, мой запрос - сходится. Что-то с дбт..
Разбираюсь с дбт, что по итогу он генерит, как он создает темповые таблицы. Нахожу запросы, которые запускались прям в БД (это было не просто).
Запускаю запрос - тоже все ок. Но почему в базе данные другие🤔

Нашел ошибку в запросе аналитика и в моем. * Немного неправильная группировка. Думаем в этом косяк. Снова сверил запросы - все ок, одинаковый правильный результат.

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

вот маленький кусочек этого запроса

case when code = 'x'
then lag(case when code = 'xxx' then create_date end)
over(partition by yyy, date_trunc('day',dea.create_date) order by create_date)
end as zzz


Я предложил проверить тайм зоны, но мы конечно же забили, подумали вряд ли в этом дело🥲

Далее подключилась еще коллега DE. Запускает запрос и сразу получает такие же данные как и в БД. То есть она одна видит косячные данные, а мы все нет)
Я подготовил маленький скриптик, который у нее запрос выдает несколько строк, а у нас у всех такой же запрос выдает 0 строк.
Уже очевидно, что-то с настройками наших IDE.

В общем, в чем проблема - у меня, аналитика и еще одного DE в настройках таймзоны было utc +3.
А у другого DE и главное в БД таймзона была просто utc (на 3 часа меньше чем мск).


И косяк вроде бы был как раз в sql кусочке, который я выше прикрепил. Если время около 12 ночи, то дата по-разному обрезается. Для нас было час ночи 29 декабря, а для БД это 28 декабря 22 часа. Или может еще дальше был косяк, там еще куча разных джоинов и фильтров с датами.
Поменял таймзону на соответствующую БД - все сошлось. Теперь я выполняю запросы и тоже вижу некорректные данные, как и в БД. Дальше уже было легко найти причину. Косяк есть и в запросе аналитика, как следствие и в моем. Все поправили. Новый MR, данные в проде сошлись 🎉

Сейчас кажется очевидной такая ошибка. Я и знал про настройки в БД, но не подумал что так может меняться результат.
Теперь у меня в датагрип таймзона utc +3, а в дбивере utc. Если что в двух местах чекну запросы. *Я знаю что таймзону можно в прям в запросе прописывать.

Мораль: всегда проверяйте настройки timezone в IDE перед дебагом дат. Это может сэкономить пару дней головной боли.
Please open Telegram to view this post
VIEW IN TELEGRAM
28👍1410🔥71🙈11
зп в it.png
727 KB
Провел для себя небольшой анализ рынка. Посравнивал различные зп-ки в it на хабр карьере. Оставлю здесь для истории и может кому тоже пригодится 🤝
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍7🤝411
Итоги 2025 it пингвин

Посмотрел итоги своего канала в 2025.
Хорошая работа - 1700+ подписчиков, 150 постов, 260к просмотров, и 3.2к😱 репостов. В начале был очень быстрый старт по +300 подписчиков в месяц. К концу года выдохся и рост сильно замедлился. Но ничего, зато в таком темпе мне прям комфортно ввести канал.
Очень понравился краткий обзор LLM. Я и хотел сделать такой канал - главное чтоб был полезный, живой и с разнообразным контентом.

Вот популярные посты:
Новая работа
Краткие определения инструментов
Будни дата инженера
Собес на Кремлевский проект
День рождения
Ссылки с бесплатным материалом по data
Статья по индексам и партициям
Транзакции и ACID
Закончил курс по DE
разбор вопросов по SQL, вопросы про джоины, задача на джоины, задачи по SQL, оптимизация SQL-запросов

Спасибо, что читаете ❤️

В карьерном плане год был тоже продуктивный:

Начал год в Альфа банке -> 5 месяцев в РСХБ -> X5

И что важно в конце года у меня НАКОНЕЦ-ТО нет желания выходить на рынок и собеситься (можно только ради контента 😅). Сейчас в компании нравится, задачки классные и крутые перспективы. В новом году переезжаем на новую платформа с новым стеком.

Также у меня есть вторая работа. И это менторство. Каждый будний день до или после основной работы у меня 1-2 менти. Мне эта деятельность нравится - здесь как нигде чувствуешь отдачу. На работе ну создал ты новый pipeline, оптимизировал запрос. И что)) Результат работы особо не чувствуется. В менторстве - помогаешь людям добиться своей цели - устроиться в it и выйти на хороший заработок.
И почему-то ко мне приходят очень топовые ребята 😅 У всех интересный бэкграунд (не айтишный), амбициозные и талантливые. Часто мы можем задержаться и просто поболтать. Пока что у меня 3 менти устроились в it - на 300к, 150к и 256к. Еще с 7 менти будем выходить на рынок в феврале - марте. Будет весело))

Вне работы - все хорошо. Наконец-то получили ключи от новой квартиры и начали делать ремонт.
Спасибо супруге, что в основном она занимается ремонтом и решает кучу вопросов. Уходит куча денег. Мы даже может и кредитнулись бы, но процентная ставка оч большая сейчас((

Побывали в Турции и нам очень понравилось. Попробовали тот самый тюлений отдых 👍
Наконец-то посмотрели игру престолов. Оочень понравилось, прям кайфанули.
И было много других приятных моментов.

Также для себя понял, что вне работы я хз чем заниматься. Не могу нормально отдыхать. Нет какого-то увлечения. Играть неинтересно (только в доту с друзьями нравится). Кучу игр пробовали, но через пару часов все дропаю. Может надо каким-нибудь спортом заняться..

В целом 2025 год мне очень понравился. Надо не сбавлять темпы, есть куда расти🫡
Можете тоже делиться со своими итогами, очень интересно почитать⤵️

Осталась только одна незакрытая задачка у меня - сделать ДЕАНОН. Пора б и ее закрыть. Скоро выложу видосик с поздравлением 💅
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥27116👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Как и обещал🤝 Не судите строго.
Всех с наступающим!🥂
Please open Telegram to view this post
VIEW IN TELEGRAM
4🤣38🔥1074🎉2💅1
Подписываем петицию на продление выходных ⤵️
Please open Telegram to view this post
VIEW IN TELEGRAM
3745💅4🤝3🤔1
Доступ к данным: где граница дозволенного?

Вчера случайно нашел у себя в хранилище таблицу с промокодами доставки.. Промокоды на скидки в рублях и в процентах, на бесплатную доставку. Как перестать думать об этой таблице 🫣

Стало интересно, а кто-то пользовался рабочими данными в своих интересах? Я говорю только о законных вещах) Без всяких сливов.

Когда я устроился в мегафон (первая моя компания в ит), получил доступ к корпоративному хранилищу, то сразу начал копаться в данных. Интересно же 😁
Посмотрел историю своих звонков. И по приколу глянул звонки друзей.. Потом говорил что слежу за ними😅 (все знали что это шутка). Возможно еще мог чекнуть историю их браузера, по каким ссылкам они переходили. Такие данные тоже были 😎
Но не смотрел, только сейчас об этом думал. Я в этом плане с уважением отношусь и не смотрю личную инфу. Просто в начале пару минут покапался 🦦

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

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

Я не буду пользоваться промиками, тк это не честно и возможно в компании могут узнать и наказать. ХЗ что для меня больше аргумент ими не пользоваться.
Но в теории могу ли я пользоваться? Насколько это наказуемо🤔

Интересно есть ли у вас какие-то подобные истории использования корпоративных данных в своих целях? И мысли насколько это вообще все корректно. Может если компания не успела все маскировать данные, то ок - можно и что-то для себя подсмотреть?🍴⬇️

Из забавного вспомнил как работал с таблицей с обращениями в тех поддержку. Там были оч смешные сообщения. Сколько там было матов и обзываний🙊
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍4😁422💅1
This media is not supported in your browser
VIEW IN TELEGRAM
Ну мы же 🥳
*при том нейронки этой же компании
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣27🔥77💅62😢1
Накрутка опыта

Да, да. Та самая холиварная тема. Я ни разу не писал по этому поводу. Понимаю и тех кто за накрутку и тех кто против.

Каждый выбирает свое. Я считаю, что проблема должна решаться сверху законами, решениями и тд. Например, проверкой трудовой ВСЕМИ компаниями. Или же, чтоб количество лет в резюме не было главным фильтром при выборе кандидата. Пока есть легкий путь трудоустройства в it, люди будут им пользоваться.

Но сейчас я хочу сказать аргумент ЗА НАКРУТКУ обычных работяг.

Знаете ли вы, что много аутстафф компаний (возможно все) крутят опыт своим сотрудникам.

Аутстаффинговые компании — это посредники, которые предоставляют сотрудников компании-заказчику, при этом сами выступают официальными работодателями, занимаясь наймом, оформлением и всеми кадровыми/бухгалтерскими вопросами.

Я сам работал в такой компании (назовем ее ЛИГА 😄) Ничего против Лиги не имею. Считаю, что эта топ компания для старта карьеры. У меня остались только положительные эмоции. Возможно я был в очень крутой команде🤔

Через Лигу я работал на Альфа банк. И если было свободное время можно было параллельно работать наставником в Лиге. Я собесил стажеров/джунов дата инженеров и аналитиков. Набирали инженеров, обучали их пару месяцев основному стеку и потом продавали в крупные банки. Также нужно было подготовить новых сотрудников к собеседованиям и сделать резюме. И в 70% процентах нам компания говорила крутить опыт сотрудникам. То есть стажер мог учиться пару месяцев и мы для него придумывали легенду под вакансию банка, крутили опыт 1 - 2 года. И стажера продавали в компанию как джун+/мидл. И есть подозрение, что банк часто был в курсе подобной накрутки. Эта была просто формальность.

И недавно общался с дата инженером, который когда-то работал в Астон. Он сказал, что в Астоне крутят 5 лет опыта 😱
Я был в шоке от такой наглости. Поэтому когда обычные работяги крутят себе опыт, я их понимаю. Сейчас с 0 опыта я скорее всего бы делал также. Сейчас такие правила игры.

Но тем кто идет по честному пути, ищет работу без накрутки - уважение 👍

Что думаете по этому поводу? 🤔⬇️

- ничего против накрутки опыта не имею, сам крутил
- против накрутки
🤷‍♂️- мне все равно, мне она никак не мешает
Please open Telegram to view this post
VIEW IN TELEGRAM
147🤷‍♂31243💅1
Ну и зачем это было делать? Только время зря трачу 😩⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
Именно такие фразы я часто слышу от ребят аналитиков, когда приходит очередной отказ после собеса.

Кому тогда достаются все эти космические офферы на 300, 500, 800 тысяч в месяц?

Об этом рассказывает Аня Денисова ➡️ @jazzlitics

Она бывший хэд аналитики нетмонет с опытом в работы на топ позициях в Ozon и Авито.

В её канале практические советы, внутрянка из компаний и разборы кейсов в видео-формате.

1. Разбор кейсов с интервью в WB, Авито и Aviasales

2. Вебинар «Как аналитику расти в 2026»

3. Лайфхак по повышению зарплаты

4. Шпаргалки по стат. критериям для техсекции (Части 1, 2, 3)

5. Секрет успешного прохождения кейс-интервью

Подписывайтесь и читайте ❤️

P.S. Скоро будут полезные эфиры про то как аналитику быстрее всего повышать свой доход в найме. Не пропустите!
Please open Telegram to view this post
VIEW IN TELEGRAM
😁10👍5😭3🔥22
Удаление дублей в Greenplum

Как-то я писал пост про удаление полных дублей из таблицы.
В обычных СУБД можно разделить полностью одинаковые строки по скрытому системному полю, например, по rowid (Oracle), ctid (PostgreSQL).

И кстати хочу сделать небольшое дополнение к этим полям, они вообще-то немного разные:
ROWID - это физический адрес строки в базе данных.
CTID - это физический адрес строки в конкретной таблице.


——-
Greenplum, как известно, это MPP система. И по сути, под капотом параллельно работаем несколько инстансов PostgreSQL.

И недавно у меня была задача по удалению дублей из Greenplum-a. И я сделал очевидную глупую ошибку. Решил рассказать об этом вам, чтоб вы не допустили 😊

Так вот, допустим есть таблица sandbox.test_duplicate с полями (sale_id, product_id, sale_date, amount и тд). В таблице лежат тысячи строк и среди них есть немного дублей. Надо просто удалить дублирующие строки и оставить только уникальные.
Набросали быстренько скрипт

delete from sandbox.test_duplicate      -- удаляем дубли по системному id строки
--select t.*, ctid from sandbox.test_duplicate t -- можно сначала посмотреть что удаляем
where ctid in
(
select ctid
from (
select t.*, row_number() over (partition by sale_id order by sale_date) as rn, ctid -- нумеруем и выводит физ. адрес строки
from sandbox.test_duplicate t
where sale_id in
(select sale_id -- выбираем только строки с дублями
from sandbox.test_duplicate
group by sale_id
having count(sale_id) > 1)
) t
where rn > 1) -- выбираем дубли ctid. rn = 1 оставим, а остальное удалим

Удаляем строки и идем пить чай 🍷 Задача выполнена🙌

Но на самом деле нет💀 Выясняется, что удалены все строки. Например было два sale_id=1, sale_id=1. Должна остаться только одна строка, но пропали две.
Или что еще хуже удалены вообще рандомные другие строки. А может все и правильно отработало.
Я потестил на разном количестве - и это рандом. На маленьком количестве строк может все и правильно отработать. На большом количестве точно будут неверные удаления. Сейчас объясню.

Проблема в запросе в том, что используется ctid в Greenplum без указания gp_segment_id. В Greenplum ctid уникален только в пределах одного сегмента, а не всей таблицы. Это приводить к непредсказуемым результатам и удалению всех строк.

То есть ctid разных сегментов конечно же могут пересекаться

Правильный скрипт будет такой:


DELETE FROM sandbox.test_duplicate
WHERE (ctid, gp_segment_id) IN (
SELECT ctid, gp_segment_id
FROM (
SELECT ctid, gp_segment_id,
ROW_NUMBER() OVER (PARTITION BY sale_id ORDER BY sale_date) AS rn
FROM sandbox.test_duplicate
WHERE sale_id IN (
SELECT sale_id
FROM sandbox.test_duplicate
GROUP BY sale_id
HAVING COUNT(*) > 1
)
) t
WHERE rn > 1
);
COMMIT;


А вообще можно глянуть на какие сегменты размазана таблица:

-- Для вашей таблицы
SELECT
gp_segment_id,
COUNT(*) as row_count
FROM sandbox.test_duplicate
GROUP BY gp_segment_id
ORDER BY gp_segment_id;

-- Количество активных сегментов
SELECT COUNT(*) as total_segments
FROM gp_segment_configuration
WHERE role = 'p' AND content >= 0;
-- Фильтры в запросе WHERE role = 'p' AND content >= 0 отбирают только активные первичные сегменты Greenplum.


Вроде супер очевидно, но я на этом попался. И удалил лишнее. Важно это все заметить на тестовой среде.

Кстати вчера у дата инженеретта был пост про удаление дублей в ClickHouse. Тоже чекните, интересно 👍

Кто-нибудь еще знает подобные тонкости по работе с разными СУБД?
В комменты закину скрипт создания таблицы. Можете тоже потестить⬇️

it пингвин | data engineer 🐧
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥179👍5421