对一个Spark流数据集列进行排名

4

我正在使用Spark 2.3.1的结构化流API。是否可以对Spark流数据框的列中的值进行排名?我尝试使用以下代码,但在异常消息后意识到流上下文无法迭代整个窗口。

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

throws

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

有人能帮我想出一个计算排名/百分位数的方法吗?

2个回答

0

是的,不幸的是没有有用的API可以做你需要的事情,尽管我尝试使用Scala groupBymapGroupWithState进行解决,例如:

val stream = ...

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

<function> 将获得您的数据上的迭代器。您可以对其进行排序并实现 rankdense_rank 等。

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

注意:您不需要在 GroupState 中保留状态,只需要使用 API 执行所需操作即可。

希望这有所帮助!


0

看起来在Spark结构化流API中还不支持窗口操作。 期待Apache Spark即将发布的更新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接