Последние посты

Дмитрий Кузьмин | Инженерия данных
22 сент., 10:01
Почему RAG-бот иногда отвечает «не знаю»✍️ В августе я только начинал погружаться в RAG и собирал первую версию информационного бота для DE-практикума. Тогда задача выглядела довольно коротко: загрузить материалы курса, подключить LLM и научить её отвечать на вопросы.Сейчас бот уже работает в бета-режиме, а схема внутри выросла в нормальный пайплайн. Хочу показать, что происходит между сообщением в Telegram и готовым ответом, и почему иногда правильный результат этого пайплайна звучит как «я не знаю».📣 RAG расшифровывается как Retrieval-Augmented Generation, или генерация с дополненным контекстом. Перед ответом модель получает несколько фрагментов, которые система нашла специально под вопрос пользователя. В этих фрагментах и нужно искать основание для ответа.Например, человек спрашивает: Я аналитик, уверенно пишу


Дмитрий Кузьмин | Инженерия данных
18 сент., 07:54
У блога появился свой герой 🐻В последнее время здесь много пайплайнов, проверок качества, Spark и Airflow, поэтому я решил немного разбавить серьёзные разборы и собрал стикерпак с DE-медведем.Внутри есть OOM, упавшие джобы, data skew, dependency hell, успешный backfill и тот самый момент, когда после обычного JOIN в таблице внезапно оказывается миллиард строк. В общем, почти стандартная рабочая неделя Data Engineer, только в виде медведя с ноутбуком.Стикеры бесплатные, можно забирать и отправлять коллегам:Забрать DE-медведяУ меня пока фаворит медведь после OOM, хотя again? тоже довольно жизненный 😅 Если будете использовать, напишите потом, какой стикер прижился больше всего и кадайте в комменты самый прикольный!


Дмитрий Кузьмин | Инженерия данных
15 сент., 08:00
💬 Какой результат SQL отправить бизнесу?Ребят, одна из частых ошибок в SQL-задачах состоит в том, что мы сразу открываем редактор, механически считаем показатель и отправляем заказчику готовую цифру. Я сам не раз на этом обжигался: запрос написан правильно, результат выглядит убедительно, а потом выясняется, что под одной и той же формулировкой мы понимали разные вещи.Покажу на небольшом примере.Менеджер присылает таблицу с заказами за сентябрь и просит посчитать, сколько клиентов было за месяц. Вроде бы обычная задача на COUNT, которую можно закрыть одним запросом.order_id | customer_id | order_date ---------+-------------+----------- 1001 | 1 | 2026-09-02 1002 | 1 | 2026-09-11 1003 | 2 | 2026-09-04 1004 | 3 | 2026-09-06 1005 | 3 | 2026-09-18 1006 | 4 | 2026-09-22На первый взгляд задача простая, но по этим данным можно вернуть как минимум триkuzmin-dmitry.ruПрактические курсы SQL для работы и собеседованийКурсы SQL с практическими задачами: от SELECT, JOIN и GROUP BY до CTE, оконных функций и собеседований уровня Middle. Выберите подходящий маршрут.
Дмитрий Кузьмин | Инженерия данных
11 сент., 10:25
Когда пайплайн упал в пятницу в 18:30, но дежуришь не ты.С пятницей! Пусть выходные пройдут отлично! 🥳


Дмитрий Кузьмин | Инженерия данных
10 сент., 08:31
Сначала выучу весь DE-стекУ меня переход в Data Engineering тормозился примерно на этой мысли. Сначала нужно разобраться с Docker. Потом с Airflow. Ещё Spark, Kafka, облака, форматы хранения… Список рос, а момент «теперь можно собрать первый проект» всё откладывался.У такой подготовки нет финиша. Всегда найдётся ещё один инструмент, который вроде бы надо изучить заранее.Сейчас перед первым учебным проектом я бы проверял базу по трём вещам:🟣 SQL. Могу написать запрос, соединить таблицы, посчитать агрегаты и объяснить, почему после JOIN строк стало больше. 🟡 Python. Могу прочитать файл, обработать данные и разобраться в чужом несложном коде. 🔘 Docker. Могу запустить контейнеры, проверить их состояние и посмотреть логи, если что-то сломалось.Оконные функции стоит подтягивать поTelegramДмитрий Кузьмин | Инженерия данных
Дмитрий Кузьмин | Инженерия данных
4 сент., 11:59
Наконец-то нормальное объяснение JOIN 😆С пятницей!


Дмитрий Кузьмин | Инженерия данных
3 сент., 08:14
112 650 строк загрузились. Этого достаточно? 😧В одной из сдач по DE-практикуму в итоговой таблице получилось 112 650 строк. На первый взгляд всё нормально: загрузка прошла, таблица заполнилась, можно идти дальше и собирать витрину.Но сначала нужно понять, что означает одна строка в этой таблице. В нашем случае это одна позиция заказа, а её уникальность определяется парой order_id и order_item_id.Допустим, при сборке факта к позиции заказа присоединились две версии одного клиента. Запрос выполнится без ошибки, таблица заполнится, но строк станет больше, а выручка в отчёте окажется завышенной. Скорее всего, проблему заметят уже в BI, где искать её будет гораздо сложнее.➡️ Поэтому отдельно проверяем, нет ли в факте повторяющихся позиций:select order_id, order_item_id, count() as row_count from core.fct_order_items



Дмитрий Кузьмин | Инженерия данных
31 авг., 08:14
📢 6 вредных привычек для потери времени в Data EngineeringСобрал несколько плохих привычек, которые когда-то были у меня самого. Некоторые стоили пары часов, некоторые целого вечера, а одна чуть не снесла всё Docker-окружение.1️⃣ Делать красиво раньше, чем правильноРаньше я мог добавить ещё один CTE, переименовать все поля и начать оптимизацию до того, как проверил сам расчёт.Проблема в том, что красивый запрос тоже может считать ерунду. Только место ошибки в нём искать сложнее.Сейчас сначала собираю простой рабочий вариант, запускаю на небольшом сэмпле, проверяю количество строк, уровень данных и контрольные суммы, а потом уже можно рефакторить и оптимизировать.2️⃣ Менять во время отладки сразу всёОднажды я одновременно правил docker-compose, переносил WSL, чистил диск и
Дмитрий Кузьмин | Инженерия данных
24 авг., 10:11
Немного личного: теперь я КМСДрузья, хочу поделиться новостью. Помимо любимой айтишной работы у меня есть ещё одно серьёзное увлечение: тяжёлое железо 🏋️Вчера мне официально присвоили разряд кандидата в мастера спорта по становой тяге. Теперь всё по-настоящему: со значком и разрядной книжкой.Шёл к этому не быстро, но последовательно. Большие цели, будь то спорт, учёба или работа, обычно складываются из маленьких действий, которые повторяешь достаточно долго.Вчера все эти шаги сложились в результат. Очень рад 🖤P.S. Ребят, всем кто скидывал мне домашки по практикуму, в ближайшее время обязательно отвечу, был занят.


Дмитрий Кузьмин | Инженерия данных
20 авг., 08:13
За последний год у меня собралась линейка курсов по SQL и Python.Эту линейку я весь год дорабатывал: пересматривал задачи, добавлял практику и менял то, что по обратной связи оказывалось слабым. По обратной связи от тех, кто уже прошёл курсы, я продолжаю обновлять задачи и добавлять то, что чаще встречается в работе и на собеседованиях.Здесь не обязательно брать самый большой курс или сразу всю программу. Полезнее выбрать один навык, которого не хватает в работе или на собеседованиях прямо сейчас.⭕️ Если пока путаются SELECT, WHERE, GROUP BY и первые соединения, лучше начать с основ.⭕️ Если ты пока неуверенно работаешь с JOIN, GROUP BY, NULL и базовыми бизнес-условиями, начни с Junior.⭕️ Если обычные запросы уже даются нормально, но есть сложности с CTE, окнами и ранжированием,


Дмитрий Кузьмин | Инженерия данных
19 авг., 07:44
Как посчитать несколько метрик без четырёх подзапросовЗадача не выглядит эффектно, зато постоянно встречается при разработке витрин.🟫 Допустим, в одной строке за каждый месяц нужно получить:• общее число заказов; • число оплаченных заказов; • долю оплаченных; • выручку по оплатам.Похожая задача есть и в моём курсе SQL Middle.Можно написать несколько подзапросов, посчитать в каждом свою метрику, а потом соединить результаты. Но для такой задачи это лишняя конструкция.☕️ Я обычно использую условную агрегацию через SUM(CASE WHEN ...):select date_trunc('month', created_at)::date as month_start, count() as total_orders,


Дмитрий Кузьмин | Инженерия данных
13 авг., 07:56
Начал ковыряться в n8n ⌨️Вокруг него много разговоров про ИИ-агентов и автоматизацию всего подряд. Я очень долго смотрел на этот сервис и все никак не мог подступиться. Сейчас захотелось собрать несколько схем руками и понять, как это работает.🔛 Пока попробовал загрузку текста через webhook, разбиение на части, простое векторное хранилище и поиск по нему. Затем добавил Telegram: отправляешь вопрос, workflow находит подходящие фрагменты и возвращает ответ.Визуально всё выглядит понятно, но внутри очень много деталей: структура items, связи между узлами, циклы, преобразования и передача контекста. Как раз это и интересно поковырять самостоятельно, и с первого раза сложно. Сервис напоминает конструктор Lego.Дальше хочу посмотреть, насколько n8n удобен для обычных задач с данными: API, проверки, небольшие загрузки и




Дмитрий Кузьмин | Инженерия данных
10 авг., 11:22
📌 Сегодня хочу дать шпаргалку. SQL-запрос легко прочитать и неправильно представить, как он выполняется.Мы пишем SELECT первым, хотя движок добирается до него далеко не сразу. Понимание этого порядка часто проверяют на собеседованиях по SQL, аналитике и Data Engineering.Упрощённый логический порядок выглядит так:FROM → JOIN → WHERE → GROUP BY → HAVING → оконные функции → SELECT → DISTINCT → ORDER BY → LIMIT⬇️Какие отсюда следствия:• WHERE фильтрует исходные строки до группировки; • HAVING работает уже с результатами группировки; • оконные функции считаются после WHERE, GROUP BY и HAVING, поэтому обратиться к результату ROW_NUMBER() в WHERE того же запроса нельзя (важно); • ORDER BY видит алиасы из SELECT, а WHERE обычно ещё не видит.Например, если нужно оставить только первую строку внутри каждой группы,


Дмитрий Кузьмин | Инженерия данных
5 авг., 07:45
🆙 В понедельник, 10 августа, стартует пятый поток DE-практикума.🧩 Если совсем простыми словами, мы берём сырые CSV-файлы и постепенно превращаем их в нормальный работающий проект: принимаем данные, чистим ошибки, раскладываем по слоям, запускаем обработку и доводим всё до отчёта для бизнеса.По пути поднимаем Docker-стенд, работаем с PostgreSQL, Spark, Airflow, MinIO и BI. Хочется, чтобы в конце ты действительно понимал, как движутся данные, зачем нужен каждый слой, где искать ошибку и как перезапустить пайплайн, если что-то пошло не так.Я собирал этот практикум примерно так, как сам хотел бы изучать Data Engineering: на одном цельном проекте, руками и с возможностью задать вопрос, когда застрял. Для меня это давно уже не просто записанный курс. Я постоянно что-то дополняю, переписываю и стараюсь проще объяснятьkuzmin-dmitry.ruDE-практикум: соберите ETL-проект от CSV до Airflow и BIПрактика для аналитиков и Junior/Middle Data Engineer: Docker, PostgreSQL, Spark, Airflow, DWH и BI. Проверка заданий и поддержка до завершения.
Дмитрий Кузьмин | Инженерия данных
31 июл., 07:51

Дмитрий Кузьмин | Инженерия данных
28 июл., 08:47
🥳 Наконец-то обновил сайтКак многие, наверное, уже заметили, за последние пару недель я почти полностью пересобрал сайт.Я менял не только оформление. Главное, что теперь по сайту можно пройти от своей текущей точки до подходящего курса или практикума: посмотреть программу, требования к старту, примеры задач и ожидаемый результат.🔍 Что изменилось:1️⃣ Разделил направленияТеперь на сайте три отдельные траектории: → SQL → Python для работы с данными → Data EngineeringВсе направления и точки входа собраны на главной странице.2️⃣ Выстроил понятный маршрут по SQL


Дмитрий Кузьмин | Инженерия данных
21 июл., 08:32
Один файл, четыре слоя и сумма, которая легко уезжаетВ пятницу показал дерево репозитория практикума и обещал показать что-нибудь интересное 😡На скрине было много папок: data, dags, db, scripts, spark, checks. Без контекста это выглядит просто как большой технический проект, и сложно понять, что к чему.Допустим, источник прислал orders.csv. Внутри идентификатор заказа, дата, статус и сумма. Одна сумма записана как 1299.90, другая как "1 299,90". Где-то нет даты, часть заказов повторилась, а один и тот же файл вообще могли прислать второй раз.😮 Путь этого файлика будет примерно таким: orders.csv → RAW → STG → CORE → MARTS → BI1️⃣ В RAW сохраняем файл таким, каким он приехал. Вместе с ним полезно зафиксировать имя, дату загрузки, источник, количество строк и хеш. Если дальше


Дмитрий Кузьмин | Инженерия данных
16 июл., 10:49
🐻 Сегодня моему блогу про Data Engineering ровно 2 года! ✨Спасибо всем, кто читает, отвечает, спорит, задаёт вопросы и иногда просто молча остаётся рядом!Очень ценю, что всё это время вы здесь! ❤️❤️❤️


Дмитрий Кузьмин | Инженерия данных
13 июл., 07:26изменён
Docker и Airflow: небольшая практика руками🙂А помните, я недавно делал опрос, что сильнее всего тормозит при изучении DE. Больше всего ответов набрали Docker и Airflow.Поэтому собрал небольшое упражнение, которое можно пройти на готовом проекте 🎧Поднимите стенд и попробуйте разобраться: 🟢 Какие контейнеры запущены и за что отвечает каждый? 🟢 Где Airflow берет DAG и из каких задач он состоит? 🟢 В каком порядке выполняются задачи? 🟢 В какие таблицы записываются данные после каждого шага? 🟢 Как проверить, что загрузка прошла правильно?После запуска DAG откройте Postgres и посмотрите данные по слоям. Проверьте количество строк, дубли, пустые ключи иGitHubGitHub - dim4eg91/de_practicum_demoContribute to dim4eg91/de_practicum_demo development by creating an account on GitHub.
Дмитрий Кузьмин | Инженерия данных
9 июл., 07:30
Ребят, кто еще делает такие ошибки время от времени?Бывает, я могу забыть запятую между CTE. Поменять дату в одном месте и забыть поменять во втором. Два раза заджойнить одну и ту же таблицу. Добавить агрегацию и забыть GROUP BY.Последнее, конечно, жестко. 🫠 Но когда торопишься, бывает.Еще классика: поставить фильтр после LEFT JOIN, а потом смотреть, почему строк стало меньше, данных нет, но вы держитесь 🧐И самое обидное, что это не сложные ошибки. Наоборот, они слишком простые. Из-за этого их и сложно ловить.В простых вещах такое встречается чаще всего. Не видишь, не видишь, а потом как увидишь.Если у тебя такое бывает, ставь 🔥#рабочее
