Чувствую себя немного потерянным в этот момент.
У меня есть потоковое приложение на основе Spark 2.4.2 и Kafka, которое записывает агрегированный (с временным окном) поток обратно в Kafka:
- [
DF1
] потоковый предварительно разделенный Dataframe (по ключу theKey
), т. Е. Поток, который гарантирует, что K поступает в один и тот же раздел каждый раз. - [
DF2
] Таблица поиска ( ~ 1000 строк), к которым я присоединяюсь с DF1. - GroupBy на основе ключа и непрерывно перемещающегося окна в течение 1 дня.
DF1.join(DF2, "df1.a" === "df2.b", "left")
.withWatermark("timestamp", "24 hours")
.groupBy(window('timestamp, "24 hours"), 'theKey)
.agg(collect_list('payload) as "payload")
Проблема: перемешивание. С предварительным разбиением набора данных перед этим (в Kafka) я надеялся получить локальный раздел для groupBy. К сожалению, это не сработало.
Вопрос в том, как правильно достичь этого без тасов? Есть ли какие-нибудь?
Решения, которые я исследовал до сих пор:
- "agg over window ...": не поддерживается при потоковой передаче (Spark throws:
Non-time-based windows are not supported on streaming
DataFrames/Datasets
) - mapPartitions: Не уверен, как учитывать в State (mapWithState).
mapGroupsWithState
требуется KeyValueGroupedDataset[K, V]
, который предоставляется только GroupByKey.
Решения, которые я рассматриваю (неохотно):
- mapPartitions на фрейме данных с настраиваемым управлением состоянием. Тем не менее, это делает потоковую передачу Spark с отслеживанием состояния бесполезной.
- Каким-то образом подключите исходное разделение ha sh (из фрейма данных Kafka) к Spark, чтобы он позаботился о перемешиваниях навсегда (а не использовал значение по умолчанию *) 1037 *), но я еще не нашел точного источника.
Любая помощь очень ценится!