Ранжирование столбца набора данных Spark Stream - PullRequest
0 голосов
/ 06 июля 2018

Я использую API структурированной потоковой передачи Spark 2.3.1. Можно ли ранжировать значения в столбце кадра данных искрового потока? Я попытался использовать следующий код, чтобы затем понять, что после сообщения об исключении невозможно, чтобы контекст потока перебирал все окно.

.withColumn("rank", row_number().over(Window.orderBy($"transactionTime")))

кидает

org.apache.spark.sql.AnalysisException: не зависящие от времени окна не поддерживаются для потоковых фреймов данных / наборов данных

Может кто-нибудь помочь мне с идеей вычислить ранг / процентиль?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Да, к сожалению, нет полезного API, чтобы делать то, что вам нужно, хотя я попытался обойти, используя Scala groupBy и mapGroupWithState, например ::

val stream = ...

stream
      .groupByKey(_.id)
      .mapGroupsWithState(GroupStateTimeout.ProcessingTimeTimeout())(<function>) 

и <function> получат Iterator по вашим данным. Вы можете отсортировать и реализовать rank, dense_rank и т. Д.

Однако вы запросили окно без информации о ключе раздела (что приведет к проблемам с OOM для огромного объема данных), в этом случае вы можете добавить одинаковое значение для всех записей, используя withColumn.

Примечание: вам не нужно сохранять состояние в GroupState, вам просто нужен API, чтобы делать то, что вам нужно.

Надеюсь, это поможет!

0 голосов
/ 11 сентября 2018

Так что кажется, что оконные операции пока не поддерживаются в API структурированной потоковой передачи. С нетерпением ждем следующих выпусков от Apache Spark

...