ивентов и полем VALUE, значение которого зависит от другого поля CATEGORY. Также есть TIMESTAMP
- это все дело льётся батчами, дубликатов много, но у каждого ивента есть ID который позволяет связывать значения между категориями
- частый юзкейс состоит в том чтобы взять данные одной категории и поджойнить их по ID c другой
Собственно вопрос: как это всё дело организовать таким образом чтобы можно было довольно эффективно джойнить данные учитывая что данных реально МНОГО и за раз нужный период и несколько категорий не запроцессить?
Я не придумал ничего умнее чем на каждую категорию для джоина сначала забирать дельту, дедуплицировать эту дельту и сохранять промежуточную таблицу, потом уже эти "дедуплицированные" таблицы брать на нужный период, делать финальную дедупликацию и уже потом финально проводить джоин.
Может у вас есть какие-то еще идеи как это сделать более качественно и эффективно, может какой-то data layout крутой есть или подход
Технологии я выбирать не могу, это spark + batch + parquet, без delta lake и стриминга
Пример данных и sql (для малого количества данных)скинуть можете? Что-то плохо вкурил условия
(пример выдуман если что) events: ID,CATEGORY,VALUE,TIMESTAMP 1,FOOD_TYPE,VEGETABLES,2022-03-03 10:11:12.11 1,<100 других FOOD_TYPE с другим timestamp> 1,FOOD_PRICE,12.33,2022-03-03 10:12:12.11 1,<100 других FOOD_PRICE с другим timestamp> SELECT types.value as food_type, prices.value as price FROM (SELECT * FROM events WHERE category = 'FOOD_TYPE' <тут еще дедупликация по timestamp>) types JOIN (SELECT * FROM events WHERE category = 'FOOD_PRICE' <тут еще дедупликация по timestamp>) prices —— @kiri3L - айди слишком много разных + интервал потенциально может меняться от года до месяца и тд —— @kvadratura - может убрать уже слоумод, а?
Видимо, дедупликация - это последнее значение по timestamp? И, надо полагать, join по ID? Не совсем понятно как идёт связка Я бы для начала попробовал оконкой отбирать последние значения в разрезе категории. И сделал (возможно) checkpoint. Получили таблицу Id, category, value Ну и дальше пробовал играть с производительностью - например убрал бы join и сделал union и min()по ID. PS. Можно попробовать сделать pivot, но не уверен в производительности. В БД это обычно плохое решение.
Ну это в целом то что я сейчас и делаю, что касается первой части, и думаю есть ли лучше варианты
Обсуждают сегодня