如何对 Streaming DataFrame 执行多个时间窗口操作?

Posted

技术标签:

【中文标题】如何对 Streaming DataFrame 执行多个时间窗口操作?【英文标题】:How to perform multiple time Window operation on Streaming DataFrame? 【发布时间】:2017-08-30 07:04:28 【问题描述】:

我在 DataFrame 中有 3 列:- [time:TimeStamp,col1:Double,col2:Double] 我要执行以下操作:

dataFrame.withWatermark("time", "10 seconds")
         .groupBy(window(col("time"),"10 seconds","1 second"))
         .agg(mean("col1") with window of 10 seconds,max("col") with window of 5 seconds)` 

【问题讨论】:

【参考方案1】:

尚不支持在单个流式查询中对不同键集(不同窗口 = 不同分组键)进行多个聚合。您将不得不运行 2 个不同的查询。

【讨论】:

感谢您的回复。如果我进行 2 个不同的查询,让我们说一个表示平均值,一个表示最大值,那么我将无法加入这些查询,因为多个聚合尚不支持加入两个流式查询或数据帧。请帮我找到解决此问题的方法。【参考方案2】:

在 2.2 之前,包含多个聚合(Avg、Max、..等 Spark 批处理)的动态规则不能应用于 Spark Structured Streaming。 即使打破查询并加入它们,Spark 也会将其视为多重聚合并抛出异常。

逻辑计划示例: Aggr1: Aggregate [EventTime#29, CategoryName#15], [EventTime#29, CategoryName#15, sum(ItemValue#10) AS sum(ItemValue)#64]

Aggr2:聚合 [EventTime#84, CategoryName#105], [EventTime#84, CategoryName#105, avg(ItemValue#100) AS avg(ItemValue) #78]

org.apache.spark.sql.AnalysisException:流数据帧/数据集不支持多个流聚合;

【讨论】:

谢谢你的回答,但我们已经知道了。我们也使用 Kafka Streams 实现了这一点。

以上是关于如何对 Streaming DataFrame 执行多个时间窗口操作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark Structured Streaming 中向 DataFrame 添加几列(仍未填充)

Spark Streaming - 将 json 格式的消息传输到 DataFrame

我怎样才能从 kafka 主题接收数据到我的 Streaming Structured DataFrame?

Spark Streaming Scala 将不同结构的 json 组合成一个 DataFrame

将 Spark Structure Streaming DataFrames 转换为 Pandas DataFrame

将 RDD 转换为 DataFrame Spark Streaming 时的 ClassCastException