对Spark流数据集列进行排名

时间:2018-07-06 09:22:59

标签: scala apache-spark-sql spark-streaming user-defined-functions

我使用Spark 2.3.1的结构化流API。是否可以在Spark Stream数据帧的列中对值进行排名?我尝试使用以下代码在异常消息之后意识到流上下文不可能遍历整个窗口。

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

抛出

  

org.apache.spark.sql.AnalysisException:流式数据帧/数据集不支持基于非时间的窗口

有人可以帮我计算排名/百分位数吗?

2 个答案:

答案 0 :(得分:0)

因此,似乎Spark结构的流式api还不支持窗口操作。 期待Apache Spark即将发布

答案 1 :(得分:0)

是的,不幸的是,尽管我尝试使用Scala groupBymapGroupWithState(例如:

val stream = ...

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

<function>将通过您的数据接收Iterator。您可以对其进行排序并实现rankdense_rank等。

但是,您请求的窗口没有分区键信息(这将导致大量数据的OOM问题),在这种情况下,您可以使用withColumn为所有记录添加相同的值。

注意:您不需要将状态保持在GroupState中,只需要API即可完成所需的工作。

希望有帮助!