Айти-Пингвин | Дата инженер
1.96K subscribers
54 photos
14 videos
2 files
75 links
Канал главного разработчика Data Lake крупного банка.
База знаний для джунов, разбор собесов, задачи (jun/mid/sen) с решениями, полезные материалы, обзоры технологий и архитектур.

По вопросам и менторству писать @it_pengwin
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Ну мы же 🥳
*при том нейронки этой же компании
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣28🔥77💅62😢1
Накрутка опыта

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

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

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

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

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

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

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

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

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

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

- ничего против накрутки опыта не имею, сам крутил
- против накрутки
🤷‍♂️- мне все равно, мне она никак не мешает
Please open Telegram to view this post
VIEW IN TELEGRAM
156🤷‍♂342432💅1
Удаление дублей в 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
🔥1914👍5421
This media is not supported in your browser
VIEW IN TELEGRAM
Как хорошо быть айтишником в 2025 2026 💅
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣295😁44🔥3🤔11
Обзор собеседования

Должность: Data Engineer
Компания: ООО Тера Интегро
Тип собеса: #тех_собес
Грейд: #Junior #middle
Вилка: 210к
Вакансия: https://spb.hh.ru/vacancy/128761959
Итог собеса: Отказ, тк кандидат еще учится в универе

Краткий обзор собеседования:
Вопросы про БД:
• Как вы начинаете изучать почему запрос стал работать медленнее какие шаги предпринимаете и на что смотрите?
• Какие физические виды Join бывают, их алгоритм выполнения?
• (Greenplum) Есть таблица транзакций 1 млрд записей она соединяется с таблицей sheets и таблицей clients по foreign key, все 3 таблицы распределены равномерно. В таблице транзакций в колонке для соединения с таблицей sheets 300 млн Null значений. Будут ли проблемы при Join этих трех таблиц?
• Как избавиться от Broadcast при соединении двух таблиц?

Вопросы по Python:
• List что за тип данных?
• Что такое lambda функция и отличия от обычной?

Вопросы по dbt (dbt Core):
• Как запустить одну модель dbt, все предыдущие модели, которые необходимо для рассчета текущей?
• Для чего используют макросы в dbt?



Как вам собес?🤔

it пингвин | data engineer 🐧

#собеседование #подписчик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1610👍5321
Обзор собеседования

Должность: Data Engineer
Компания: EmployCity
Тип собеса: #тех_собес
Этапы: 1 техничка > тестовое задание, созвон и обсуждение решения > знакомство с командой
Грейд: #middle
Вилка: 3-4к евро плюс оплата перелета и 700 евро на проживание каждый месяц
Вакансия: https://hh.ru/vacancy/128579553
Итог собеса: 1 этап прошел

Краткий обзор собеседования:
Вопросы по CDC:
• Как работал со связкой Kafka+CDC?
• Как забирали историчные данные с источника CDC?

Вопросы по dbt:
• Какие материализациии использовались чаще всего?
• Какие стратегии иксрементного обновления использовал?

Вопросы:
• Как запускали даги в Dagster?
• Что использовали для контроля зависимостей в проекте?


Новый обзор подъехал. Как вам?
По мне так зп для Кипра небольшая 🤔

it пингвин | data engineer 🐧

#собеседование #подписчик
Please open Telegram to view this post
VIEW IN TELEGRAM
17🔥8👍411
This media is not supported in your browser
VIEW IN TELEGRAM
Коллектив, тимбилдинги и корпораты - это реально важно 🙌

В одной из моих первых IT-компаний был оч крутой коллектив.
У нас имелся свой маленький закрытый чатик с личными мемасами и внутренними шутками. Мы могли поугарать над заказчиками, поболтать на рандомные темы или просто сидеть на созвоне часами, параллельно работая. А тусовки были вообще огонь..💔
Please open Telegram to view this post
VIEW IN TELEGRAM
196👍4🔥3🤣2
Очередные вопросы по SQL с собеседования

Итак, дана таблица с одним полем flag


CREATE TABLE sandbox.test (flag integer);

INSERT INTO sandbox.test (flag) VALUES
(0), (1), (2), (3), (4), (5), (null), (null);



Давайте закрепим популярные вопросы про count

• select count(*) from sandbox.test;
-- Результат 8
• select count(1) from sandbox.test;
-- Результат 8
• select count(0) from sandbox.test;
-- Результат 8
• select count(null) from sandbox.test;
-- Результат 0
• select count(flag) from sandbox.test;
-- Результат 6
• select count('flag') from sandbox.test;
-- Результат 8

Объяснение почему так:

• COUNT(*) считает количество строк в таблице

• COUNT(1) и COUNT(0) - то же самое: 1 и 0 здесь просто константы, они не NULL, поэтому каждая строка учитывается

• COUNT(flag) - считает только не NULL значения в колонке flag.

• COUNT(NULL) - всегда 0, потому что NULL - это отсутствие значения. Еще раз, COUNT никогда не возвращает null


Вопросы про count популярны на собесах. А вот про функцию sum более редкие. И меня один кейс удивил..

• select sum(*) from sandbox.test;
-- Ошибка!
• select sum(flag) from sandbox.test;
-- Результат 15
• select sum(0) from sandbox.test;
-- Результат 0
• select sum(1) from sandbox.test;
-- Результат 8
• select sum(2) from sandbox.test;
-- Результат 16
• select sum(4) from sandbox.test;
-- Результат 32

Почему SUM(*) - ошибка?
Потому что * означает «все колонки». А как сложить строку с числом? Или дату с текстом? База данных справедливо говорит: «Я не умею складывать всё подряд, дай конкретную колонку».

SUM(flag) = 15 - логично
Складываем числа: 0+1+2+3+4+5 = 15. NULL игнорируются (не участвуют в сумме).

А теперь самое неочевидное - SUM(1), SUM(2), SUM(4)


Многие думают: SUM(1) должен вернуть 1. Но нет!

Давайте представим, как база данных выполняет этот запрос:

Берем таблицу из 8 строк

Для каждой строки вычисляем выражение в скобках:

Для SUM(1) → значение 1 в каждой строке

Для SUM(2) → значение 2 в каждой строке

Для SUM(4) → значение 4 в каждой строке

Складываем все эти значения

Получается:
SUM(0) = 0+0+0+0+0+0+0+0 = 0 (тут логично)

SUM(1) = 1+1+1+1+1+1+1+1 = 8 (количество строк)

SUM(2) = 2+2+2+2+2+2+2+2 = 16 (2 × 8 строк)

SUM(4) = 4+4+4+4+4+4+4+4 = 32 (4 × 8 строк)


SUM(константа) работает как умножение константы на количество строк в выборке.

И да, количество полей в таблице никак не влияет на результат. Даже если в таблице 100 колонок, SUM(2) всё равно вернет 16. Главное - сколько строк попало в выборку.

Честно говоря, я такие вопросы на собесах оч не люблю. Какой от них практический смысл я хз. Кто хоть раз писал count(0) или sum(4). Но раз такое часто спрашивают на собесах, то нужно быть готовым 🤝

Интересно, сколько людей ответили правильно на всё?
Ставь если на все ответил правильно
И ставь если допустил хотя б одну ошибку.

it пингвин | data engineer 🐧
Please open Telegram to view this post
VIEW IN TELEGRAM
45617👍10🔥964
Вопросы с hr скрининга

1️⃣ 1 + NULL в SQL = NULL
2️⃣ Типы физических джоинов = Nested Loop, Hash, Merge, Broadcast (в Spark)
3️⃣ Какими оконными функциями можно получить номер строки = ROW_NUMBER(), RANK(), DENSE_RANK()
4️⃣ Может ли быть число ключом словаря = да
5️⃣ Может ли быть строка ключом словаря = да
6️⃣ Может ли быть список ключом словаря = нет
7️⃣Какое максимально и минимальное число драйверов может быть в спарк = min/max =1 (в одном Spark-приложении)

it пингвин | data engineer 🐧
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍3610🔥532💅2
Программа со скидкой до 5 марта (напоминаю я делал серию обзорных постов курса)
👍5🔥11
Мне тут прилетел подгончик от моего топового менти

У нас была цель - в сжатые сроки устроиться на работу.
Менти всё это время жёстко гикал, и в итоге мы достигли результата:
спустя два месяца после начала занятий он уже вышел на свою первую работу в DE

Испытательный срок тоже успешно пройден - на работе им довольны.

Параллельно он начинал вести канал, но из-за высокой нагрузки пришлось поставить на паузу. Скоро вернётся к постам.

Его тэгэшчка 🔜 DROP TABLE

И вот мне прилетел обещанный тречок
(менти вообще битмейкер и продюсировал популярных исполнителей) ⬇️😮‍💨

*трек рофельный и сделан на скорую руку - думаю, это всем понятно 🤝
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1342🤣2👍1😱1💅11
Вопрос

В конце каждого месяца загрузка многих таблиц замедляется. В чем причина замедления?
При условии, что общее количество ETL потоков в БД не увеличивается.

Причину замедления в своем хранилище напишу в комментах и как ее решили
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1541
Лучше пост сделаю

В целом вот правильный ответ - https://t.me/data_penguin/229?comment=4524
Точнее так - это проблема была в моем dwh. Но там еще интересные варианты написали 👍

Просто это вроде как очевидно, но я об это не задумывался пока не столкнулся с замедлением.

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

Например, по одной таблице раньше за один день прилетало 50к строк. И за месяц было ~1,5 млн строк (это нормальный размер для партиции). А теперь прилетает ~1млн строк в день. Партиции к концу месяца уже десятки миллионов строк.
Конечно выбор данных из них всё медленнее и медленнее. Хотя по классике в скриптах чаще всего фильтр стоит по дню и нам не нужно просматривать целый месяц.

В общем, решение:
Там где это можно и не поломает запросы - аккуратно переходим на недельные партиции. Запросы стали бегать быстрее
Please open Telegram to view this post
VIEW IN TELEGRAM
👍218🔥211
Бесплатная реклама для своей компании))

Если часто покупаете в Пятерочке рекомендую оформить апельсиновую карту (коллаба с Альфа банком) + сервис пакет (вроде 130 рублей в месяц стоит).

Реально много баллов кэшбэком приходит. Вчера потратил 3500 - вернулось баллами ~600 рублей (10 апельсинок = 1 рубль). + Допом кэшбэк на банковскую карту приходит. Сервис пакет дает много категорий с повышенным кэшбэком.

Доставкой еще приятнее пользоваться, больше апельсинок и еще какие-то доп акции.
В общем, рекомендую 👍

Прикольно когда нравится продукт, в котором работаешь 💅
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥9😁7💅322
Анализ рынка IT

Напишу свои мысли о ситуации на рынке DE в 2026. Просто мое мнение. Можно сказать сплетни 💅

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

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

ЗПки в среднем тоже стали меньше. Раньше если писал аутстафф с предложением устроиться на проект Сбера, то предлагали вилки от 300+ легко. Сейчас очень часто пишут зп 220, 250, 270. Торгуются не охотно.
Имхо в прошлом году на мидл+ можно было найти работу с зп 270-350. В этом году вилка стала ~230-320.

Хорошие предложения тоже есть. Не все так плохо. Просто конкуренция больше. Недавно знакомый получил оффер на 465к.
Кстати, на стажировке Яндекс может платить ~70к, Райф ~100к.

С другой стороны если сравнить средние ЗП перед новым годом с хабр карьеры (мой пост), то вроде средние зп немного даже выросли 🤷‍♂️

Сейчас мои менти активно ходят по собесам, так что чуть позже будут обзорные посты. В целом кажется собесы в DE особо не меняются. Тбанк дает одну и ту же задачу уже третий год 🤝

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

А что вы скажите по рынку it? Чувствуете просадку? Что там в аналитике? Может у кого-то есть инсайдики 🎮⬇️

it пингвин | data engineer 🐧
Please open Telegram to view this post
VIEW IN TELEGRAM
11🔥874
Год назад создал тг канал

20 марта стукнуло 1 год каналу. Это очень интересный опыт. Ни сколько не жалею, что создал тгшку.
Но итоги сейчас не хочу подводить, тк это я делаю обычно летом на др или на нг.

Из прикольного, нашел у себя в заметках варианты названий для канала😁:

it пингвин
Data and Dota
404 not data found
Базовичек
Это БАЗА данных
Айтигр

Хочется только сказать, что грустно что сейчас происходит с тг в России. За год как-то сильно все поменялось. Столько сил и времени вложено в канал, не хочется его потерять.

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

В общем, ситуация грустная. Я не уверен, что в текущих условиях я бы создавал канал. Из-за возможности какой-то блокировки. На рекламу мне все равно. Для меня это просто приятный бонус.
А так надеемся на ВПН 🙏, чтоб его не блокнули.

И спасибо, что читаете ♥️ Сейчас большая нагрузка на работе, в менторстве, ремонт.. Так что сложно часто делать посты. В заметках уже много тем для постов, нужно только найти время на написание.
Please open Telegram to view this post
VIEW IN TELEGRAM
49🔥1142💅1
Вакансия - аналитик данных

Аналитики, кто ищет работу, нашел интересное предложение:
hh.ru/vacancy/131239680

Компания ищет талантливого Аналитика данных, который поможет сделать путешествия еще более доступными и увлекательными!

Дерзайте!😘
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣376😱5🔥2💅1
Итоги по Performance Review поставили на 1 апреля..😭
Please open Telegram to view this post
VIEW IN TELEGRAM
1😁35🤣75😭1
Произошла утечка исходников Claude Code

Мб кому-то будет интересно покопаться в репе:
https://github.com/instructkr/claude-code

И уже накатали неплохой обзор проекта
https://habr.com/ru/companies/bar/articles/1017574/
1🔥1262