дата инженеретта
3.36K subscribers
277 photos
28 videos
4 files
117 links
мелкое — крупно,
в глубоком разговоре
мудрость приходит

по вопросам сюда: @aigul_sea
Download Telegram
Iceberg это must have?

Вы еще не замечали, что становится больше вакансий, где айсберг уже требуют?

С одной стороны, если посмотреть на hh, то вакансий с айсбергом всего около 5%. Но, с другой стороны, в последнее время на меня выходят именно с формулировкой обязательности

Собрала список компаний, которые хотя бы частично уже живут на Data Lakehouse:
📌Ламода
📌Магнит
📌Альфа
📌М.Видео
📌МТС
📌Сбер
📌X5
📌Лента
📌Золотое яблоко (Delta Lake)

А вот Озон по состоянию на прошлый год планировал идти в Data Mesh, чем в Data Lakehouse

Что вообще думаете?

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
107
Датаклассы

Наконец-то спустя год дошли руки написать про датаклассы 🌷 Меня спросили на собесе в ламоду, и тогда я про них либо краем уха слышала, либо вообще не слышала. Но точно не использовала. Посмотрим, что с ними можно делать

Зачем?

Датакласс описывает данные, но без кучи лишних методов. Он сам вместо нас добавит __init__, __repr__, __eq__ по дефолту. Набор методов можем сами менять с помощью флагов

Как создать?

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


from dataclasses import dataclass

@dataclass
class SparkParams:
"""Dataclass для параметров spark-submit команды."""

name: str
deploy_mode: str
driver_cores: int
driver_memory: str
executor_cores: int
executor_memory: str
num_executors: int


Готово! Никакие методы добавлять не нужно

Как использовать?


spark_params = SparkParams("test_app", "cluster", 2, "4g", 4, "32g", 8)


Другие фишки

Запрещаем менять поля:


@dataclass(frozen=True)


Задаем дефолтные значения:


@dataclass
class Team:
description: str | None = None
emails: list[str] = field(default_factory=list) # для list/dict/set


Чуть подробнее можно прочитать в короткой статье

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26125
AI-эра

🤵 Я последние пару недель жестко подсела на видосы с фаундерами, CEO на тему бизнеса и AI. Все началось с поста про интервью с основателем Revolut Николаем Сторонским. Дальше мне захотелось узнать мышление других мировых лидеров, и пошло-поехало

В основном, на подкастах обсуждают, что нас ждет в 2030, 2035, 2040. Но уже в этом году прогнозируют, что появится AGI - Artificial General Intelligence. Если не в этом, то точно в следующем. Он будет умнее всех нас. К 2100 году один из экспертов по AI-безопасности предсказывает, что либо людей не будет, либо будут существа, которых мы не будем понимать

🍕 Из крутого на текущий момент - на США в гугле раскатана фича "Have AI call". Вы можете загуглить ближайшие рестораны, нажать эту кнопочку - через несколько минут вам на почту придет отчет, в каких ресторанах есть свободные места, а до каких агент не дозвонился

Есть агенты, которые режут рилсы. Или гуглят по видосам, когда не можете вспомнить, где слышали цитату. А из особо крутого я узнала про Genie 3 от Google DeepMind - там можно смоделировать новый мир

📖 Также обсуждают, что детям сегодняшнего дня в колледж идти уже не имеет смысла. Потому что после выпуска они с очень высокой вероятностью не смогут найти себе работу. От людей требуется все более и более сложная работа

🤖 Физических роботов ожидают лет через 10-15. Мне очень понравилась идея от CEO Microsoft AI - робот проактивный, он знает, что на выходных будет куча гостей, сканирует холодильник, заказывает еду. Еще можно придумать, что в сам холодильник встроены программы (ПП, еще что-нибудь), и он понимает, чего тебе не хватает. А потом домашний робот принимает продукты от ровера и расставляет в холодильник. Ммммм...

Список каналов, которые мне понравились:

The Diary of a CEO - классный ведущий, задает нетривиальные вопросы

Cleo Abram - тоже классные вопросы, канал ориентирован на обсуждение позитивных сторон технического прогресса

Stanford Graduate School of Business - интервью с C-level в актовом зале для студентов

Silicon Valley Girl - на Марину я подписана давно, но каких же крутых персонажей она теперь зовет на подкасты, некоторые дублируются на русском на втором канале

Lex Fridman - очень своеобразный, он не про заковыристые вопросы, а про длительное монотонное общение

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥157🌚5😭3💅1
Самый дурацкий кусок кода

У вас есть такой код, который вы один раз увидели, но никогда не забудете? Потому что он был настолько странным и запомнился надолго

😱 У меня такой есть. Это джойн 15 раз в цикле с таблицей, от которой отфильтровываются строки, при этом несколько раз копируются датафреймы

Хоть и требовалось максимально сохранить код автора, но я все равно переписала на один джойн + фильтр. Смотря на оригинальный код, я даже сейчас не до конца понимаю, что там происходит и как это писалось 🤪

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚12🤷1
Как я проводила собесы

Собесы я хотела проводить еще года 4 назад. Но тогда брали коллегу, которая пришла чуть раньше меня( Но моя цель все-таки реализовалась, и я наняла 1 DE и 1 DQE

🤔 Всего я провела 25 собеседований. Резюме из канала поначалу кидала техлиду, чтобы он помог понять, подходит ли человек и на что вообще смотреть. HR раз в неделю присылала по 10 резюме, мы с PO отбирали понравившихся кандидатов по принципу: сомнение = нет

Для подготовки мне дали файлики с вопросами по грейдам. Позже я собрала свой пул, добавив вопросы со своих и чужих собесов

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

Собес - это из black box (или gray box, т.к. есть резюме) сделать white box.

из заметок дата инженеретты


👩‍💻 Я начинала с вопросов по опыту, подмечала несостыковки, потом это раскручивала. Было прикольно, когда один вопрос сразу вскрывал правду 😁 Вроде написано sql и несколько бд, а там: таблички не создавал, в бд ничего не писал, full join не использовал, объемы не знает, про кликхаус только слышал, да и начал изучать месяц назад

По технике у меня не было конкретного порядка. Просто 300 вопросов - некоторые я задавала почти всегда, а остальные выбирала по ходу. Иногда кандидат был хорошим и не хотелось задавать простецкие вопросы. Иногда приходилось спрашивать про having и все равно получать неправильный ответ 😭

Некоторые кандидаты были не очень с первых минут, но мы все равно сидели час. В следующий раз порекомендовали просто завершать встречу пораньше. Хотя со мной дважды завершали встречу через 20 минут - было неприятно))

После собеса мы с PO обменивались мнениями, и разногласий практически не было. Вот некоторые ред и грин флаги из моих заметок:

нет вопросов, не заинтересован в вакансии
нет общих де чатиков
"просто делал, что мне сказала команда"
очень много говорит "разное", обобщенно
жутко медленный, сложно следить за ходом мысли
много говорит, нечетко отвечает
душный, тяжелый, прикапывается к каждому вопросу
подключился с улицы с телефона в костюмчике
не понравилось, когда старший коллега спросил, можно ли в хайве сделать primary key (типо опытнее, но тупее)

ОС попросил от меня по ответам
"готов с этим справляться"
приятный уверенный чел
инициативный, осознанный
умеет думать

Кто тоже проводил, поделитесь своими флагами?

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍105😁5
Как поведёт себя аналитическая СУБД в облаке под нагрузкой? Разбор реального кейса

Selectel и СР-ТЕХ приглашают на практический вебинар, где покажут, как провели нагрузочное тестирование и масштабировали аналитический кластер на 111 узлов всего за час в облаке.

📅 31 марта, 12:00
📍 Онлайн
👥 Для дата-инженеров, архитекторов данных, DevOps и SRE-инженеров, технических руководителей

👉 Смотрите полную программу и регистрируйтесь: https://slc.tl/y4ba6

Чтобы не пропустить вебинар и узнавать о других событиях и бесплатных курсах Selectel, подписывайтесь на @selectel_events

Реклама. АО "Селектел". erid:2W5zFJybJAd
👍3🤷3
Мы свернули куда-то не туда😁
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1912😭4💯1
Как положить гитлаб?

Кратко: внедрить нейронку🧑‍🦲

Что произошло?

В MR начали бесконечно запускаться пайплайны с тестами каждые полминуты. Когда я впервые увидела, их уже было 90 штук!🪿

Как мы до такого докатились?

Есть джоба, которая скачивает либу, красиво форматирует файлики и пушит изменения

Нейронка добавила кэширование, чтобы при повторной установке либа бралась из кэша, а не скачивалась по сети

Вроде бы хотелось как лучше, а получилось как всегда

Все сломалось 😭

Что было упущено?

1. Изначально джоба коммитила все измененные файлики через git add . Но и никогда не предполагалось, что будет писаться в репо что-то еще. Здесь сузили git add до папки/типов файлов

2. Папка с кэшом не была добавлена в .gitignore

3. Никто не увидел опасности этого изменения, потому что была еще куча других

🤓 В общем, на нейронку надейся, а сам не плошай

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10🌚54
Каждому по лейкхаусу

Мой коллега Саша запилил крутецкий курс по айсбергу! 😎 Я сама его полностью прошла, записала несколько новых для себя моментов и осталась очень довольна контентом👍

Например, вы знаете, как сделать CDC на айсберге? Или как выглядит partition evolution на уровне storage? У вас могут лежат непартицированные, партицированные и по-разному партицированные данные в одном месте, и это работает🤩

Поэтому если хотите освоить технологию на практике и перейти в Senior-лигу, то присмотритесь к курсу «Apache Iceberg для Data Engineer»

Главная фишка: вы соберете полноценный Lakehouse прямо на своем ноутбуке

В программе только суть:

🤩Внутреннее устройство и транзакционность таблиц
🤩Data-as-Code: Time Travel, ветвление и тегирование
🤩Performance Tuning: как выжать из Iceberg максимум скорости

🎁 Специально для подписчиков моего канала - скидка 15% по промокоду

DATA_ENGINEERETTE


🚀 Регистрация тут
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍125
Могла стать главной в yandex cloud

На меня вышел человечек и предложил зарефералить на позицию Product Manager для развития продуктов для де в облаке. Я внутри себя: что?? меня???😱 Конечно, делаем!

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

🤩Работали менеджером продукта и реализовали успешные продуктовые изменения
🤩Разбираетесь в product discovery, умеете проводить качественные и количественные исследования, проводить конкурентный анализ
🤩Понимаете, как устроен цикл продаж, знакомы с управлением и ценообразованием

Но зато я буду знать свои слабые стороны и подноготную менеджерского процесса

🤓 Реферер мне очень много рассказал про стек, задачи, продукты, архитектуру, накидал кучу полезных ссылочек на доклады (в том числе с собеседующими), материалы по продуктовым исследованиям

👩‍💻 Процесс собесов отличался от разработческих ролей. У меня было 2 встречи (без алгосов!): с руководителем продактов и лидом всех тех команд. Из технических вопросов больше общались про миграцию, перформанс, каталоги айсберга, глоссарий, мой путь до де. А в целом мне рассказали про текущий стек и сервисы, чем сейчас занимаются, куда целятся, планы/мечты, составы команд, ожидания от продакта

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

🌸 Конечно, мне не хватило опыта работы продактом) А возможно, под такую ваку полу де/полу продакт просто нужно было нанимать двух людей. Но опыт был интересный!

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2595
Копаемся в метасторе

Вы когда-нибудь заглядывали, что на самом деле хранится в базенке хайв метастора? Там создаются системные таблицы с инфой по базам, таблицам, путям, колонкам и еще много всего

Из наиболее полезных таблиц я для себя выделила:

🤩COLUMNS_v2 - о колонках
🤩CTLGS - о каталогах
🤩DBS - о схемах
🤩ROLES - о ролях
🤩SDS (Storage Descriptors) - о путях к таблицам
🤩TABLE_PARAMS - о свойствах таблиц
🤩TBLS - о таблицах

И на основе этого мы можем вывести сводную инфу по всем схемам, таблицам, полям:


SELECT
d."NAME",
t."TBL_NAME",
t."OWNER",
s."LOCATION",
c."COLUMN_NAME",
c."TYPE_NAME",
c."COMMENT"
FROM "TBLS" as t
JOIN "DBS" d
ON t."DB_ID" = d."DB_ID"
JOIN "SDS" s
ON t."SD_ID" = s."SD_ID"
JOIN "COLUMNS_V2" c
ON s."CD_ID" = c."CD_ID"
--WHERE d."NAME" = 'raw'
--AND t."TBL_NAME" = 'test'
ORDER BY d."NAME", t."TBL_NAME", c."INTEGER_IDX";


А на этой картинке представлена ER-диаграмма модели данных

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16
Разбираемся в каталогах

Начинаем понедельник с распутывания клубочка🧶 Концепций каталога развелось столько, что я сама уже запуталась, что есть что) Давайте вместе разложим по полочкам

Трино

Каталог - это конфиги для подключения к разным источникам данных

Они прописываются в файлике по типу etc/catalog/iceberg.properties:


connector.name=iceberg
iceberg.catalog.type=hive_metastore
hive.metastore.uri=thrift://hive-metastore:9083


Потом можно в запросах обращаться по названию этого коннектора:


SELECT * FROM iceberg.db.table;
SELECT * FROM postgres.public.table;


Spark

Каталог - это API Spark для работы с разными источниками данных

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


spark.conf.set("spark.sql.catalog.spark_catalog", "org.apache.iceberg.spark.SparkSessionCatalog")
spark.conf.set("spark.sql.catalog.spark_catalog.type", "hive")

spark.conf.set("spark.sql.catalog.clickhouse", "com.clickhouse.spark.ClickHouseCatalog")
spark.conf.set("spark.sql.catalog.clickhouse.host", "host")
spark.conf.set("spark.sql.catalog.clickhouse.user", "user")
spark.conf.set("spark.sql.catalog.clickhouse.password", "password")


Дальше обращаться по названию каталога через Spark SQL/DataFrame API:


spark.table("spark_catalog.default.table")
spark.table("clickhouse.default.table")


Iceberg

Каталог - это хранилище метаданных Iceberg таблиц (где лежат снепшоты, манифесты, схемы)

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

Есть несколько реализаций: HMS (Hive Metastore), JDBC (обычные бд), AWS Glue, REST - Nessie, Polaris, Lakekeeper, lakeFS, Tabular, Unity Catalog

Data Catalog

Каталог - это реестр всех метаданных

Он нужен для Data Governance: сканирует мету из бд, хранит схемы таблиц, содержит техническое описание сущностей и полей, бизнес-описание метрик, умеет в data lineage. Здесь каталог вообще сборку от предыдущих пунктов

Примеры: DataHub, OpenMetadata, Apache Atlas, Amundsen, Marquez, AWS Glue Data Catalog

@data_engineerette
👍13🔥76
Мой первый инцидент

У нас есть процесс дежурств, где нужно следить за кластером, поднимать даги, помогать пользователям

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

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

Я смотрю в кафку - данные приходят

Я смотрю спарк приложение - оно running, тасочки выполняются

Все работает, а данных нет
🤔🤔🤔

Детальнее углубляюсь в тасочки - все читается, но количество строк = 0

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

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

👀 Потом я анализирую каунты по датам. Данных пришло в 20 раз больше, чем изначально закладывалось под этот топик

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25😭832👍2🤔1
Аналитика, DWH и OLAP-нагрузки растут, и базы начинают упираться в дисковую подсистему…

Для таких задач Selectel добавили новую конфигурацию Mega в базы данных на выделенных облачных серверах. Это кластер объёмом до 27,1 ТБ, приватной сетью 10 Гбит/с и производительностью до 1,5 млн IOPS.

Хороший вариант для высоконагруженных и масштабируемых систем, где важна физическая изоляция данных. По стоимости выходит до 47% дешевле, чем стандартные DBaaS-решения.

Протестируйте бесплатно, до 30 000 бонусных рублей на запуск — по ссылке: https://slc.tl/57jls

Реклама. АО "Селектел". erid:2W5zFGkXM2y
🤔3🤷2
Одна из оптимизаций адаптивки

У меня есть много запросов вида "select ... from ... order by". В какой-то момент я заметила, что иногда джобы стартуют, а иногда нет, но считается все нормально. Но разобраться-то все равно интересно)

☕️ Я смотрю план запроса у таблиц. Initial Plan у них одинаковый - чтение, селект, сортировка:


== Initial Plan ==
Sort
+- Exchange
+- Project
+- BatchScan catalog.schema.table


☕️ Смотрю финальный план

1 таблица (запускает джобу):


== Final Plan ==
AQEShuffleRead
+- ShuffleQueryStage, Statistics(sizeInBytes=368.0 B, rowCount=1)
+- Exchange
+- * Project
+- BatchScan catalog.schema.table1


Длительность - 4с

2 таблица (не запускает джобу):


== Final Plan ==
LocalTableScan


Длительность - 10мс
И причем тут LocalTableScan?

☕️ Прикол в том, что во второй табличке 0 строк. И включена адаптивка (spark.sql.adaptive.enabled = true). Адаптивка в спарке понимает, что бессмысленно шафлить 0 строк данных, и возвращает результат за несколько мс

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14
Нетворкинг для разведчиков

По рекомендации прочитала книжку «Нетворкинг для разведчиков» от пары советских разведчиков. Она лучше предыдущей, вдохновила меня на практику, но не прям вау, у них много похожих мыслей

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

📖 В американской книге автор утверждал, что у него много друзей. А тут авторы говорят, что нетворкинг — это не про поиск друзей, друзья — лишь побочный продукт

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


Чтобы хорошо нетворкаться, нужно:

1️⃣Определить цель
2️⃣Определить стратегию, путь к цели, нарисовать карту контактов
3️⃣Продумывать наперед все сценарии развития событий и свои действия
4️⃣Систематически тренироваться

Что за карта контактов? Рисуете круг, делите на сектора по областям деятельности и на кольца по плотности знакомства. В итоге я нарисовала 200+ контактов. Потом мне надоело, я не поняла, что дальше делать, и забросила🤣 Видимо, надо сначала придумать цель

📖 Естественно, сближаться нужно не со всеми людьми, а с этими:

📌коннекторы, у кого много знакомых
📌конденсаторы, у которых много инфы (чтобы потом обменять с новыми людьми через коннекторов)
📌мосты, которые открывают доступ к другой стране/организации
📌восходящие звезды = лидеры завтрашнего дня

Также рекомендовали возобновить общение со старыми контактами. Я попробовала, но одна половина мне не ответила, с другой после нескольких сообщений общение снова остановилось😁 Из интересного узнала только, что одногруппница из муз колледжа все-таки переехала в Германию, учится там в маге и преподает

📖 Из реальных способов познакомиться предлагается:

📌просить друзей познакомить с их знакомыми (я этим ни разу не пользовалась)
📌бывать в клубах, онлайн группах, встречах
📌участвовать в мероприятиях (митапы, волонтерства) или создать свое

Еще в американской книге автор рассказывал, что он изучает соцсети, выписывает списки увлечений. Мне тогда это казалось сталкерством. В моей голове разговор выглядел так: “а я знаю, что вы увлекаетесь шахматами”😏 😏 Но тут я поняла, что это нужно для завязывания диалога, когда вы впроброс говорите:

вы: в свободное время я прихожу в шахматный клуб
он: о, а я в университете участвовал в турнирах
вы: (искренне удивляясь, хотя фотки с турниров давно у вас сложены в отдельную папочку) правда? а какой у вас рейтинг?..


Из полезного нужно всегда иметь наготове:

📌представление себя
📌главные новости
📌готовые списки тем и вопросов для разговора
📌зацепки (попросить собеседника или предложить помощь самому)

Еще я записала себе пару практических упражнений:

📌сидеть в тц, смотреть на людей и делить, с кем хотелось бы встретиться, а с кем нет
📌провести день, обращая внимание на свои и чужие эмоции

Что думаете? Стало быть, нетворкинг - это чисто циничная штука?

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥103💯1💅1
Data Vault за один вечер

Решила я тут погрузиться в дата волт на практике. Нашла интересный проект — AutomateDV (бывший dbtvault)

У них есть демо-проект, в котором создаются разные сущности, несколько видосов с объяснениями и небольшая, но очень детальная дока

💻 Поставила себе по инструкции dbt-core, dbt-postgres:


python -m pip install dbt-core dbt-postgres


Подключила AutomateDV — это просто пакет в dbt-проекте, задается в packages.yml:


dbt deps


Подняла постгрю в докере, настроила коннекшены, создала проект:


dbt init


Сгенерила данные из датасета TPC-H и положила их в volume:


pip install tpchgen-cli
mkdir data
tpchgen-cli -s 1 -f csv -o ./data


Создала таблицы и загрузила в них данные:


COPY region FROM '/var/lib/postgresql/data/data/region.csv' DELIMITER ',' CSV HEADER;


🐾 Поначалу я смотрела видосы и делала все ручками. Потом забила и чисто запускала модельки, смотрела, что получается. Фреймворк автоматизирует создание дата волта. Во-первых, для стейджинга можно использовать такие поля:

derived_columns - новые поля
hashed_columns - поля для хэширования

Тут мы добавили поле как алиас другого, поле с константной строкой, сделали хэш из 2х первичный ключей:


{%- set yaml_metadata -%}
source_model: 'raw_orders'
derived_columns:
CUSTOMER_KEY: 'CUSTOMERKEY'
RECORD_SOURCE: '!TPCH-ORDERS'
hashed_columns:
ORDER_CUSTOMER_PK:
- 'CUSTOMER_KEY'
- 'ORDERKEY'
...


Во-вторых, создание самих сущностей происходит с помощью удобных макросов:


automate_dv.stage()
automate_dv.hub()
automate_dv.sat()
automate_dv.link()
automate_dv.pit()
...


Все модельки можно позапускать, а потом сгенерить доку по проекту:


dbt run -s +v_stg_orders
dbt run -s hub_customer

dbt docs generate
dbt docs serve


😅 Но саааамое прикольное — это после компиляции моделек зайти в папку target/ и посмотреть, что там нагенерилось. И еще сходить в исходный код самого пакета в dbt_packages/

А нагенерилось там вот такое:


—хэширование нескольких полей
DECODE(MD5(NULLIF(CONCAT_WS('||',
COALESCE(NULLIF(UPPER(TRIM(CAST(CUSTOMER_KEY AS VARCHAR))), ''), '^^'),
COALESCE(NULLIF(UPPER(TRIM(CAST(ORDERKEY AS VARCHAR))), ''), '^^')
), '^^||^^')), 'hex') AS ORDER_CUSTOMER_PK,


—отбор по rn для инсерта в линки
ROW_NUMBER() OVER(
PARTITION BY rr.ORDER_CUSTOMER_PK
ORDER BY rr.LOAD_DATE
) AS row_number

—отбор уникальных значений в сателлит по хешу
WHERE b.INVENTORY_HASHDIFF != b.prev_hashdiff


В общем, интересно поковыряться, как они придумали, и вдохновиться, если у вас сложнее/что-то забыли учесть/еще не реализовали

@data_engineerette
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥157🤔51