Spark Structured Streaming - 具有窗口时间事件的自定义聚合

时间:2018-05-09 09:16:52

标签: scala apache-spark apache-spark-sql spark-structured-streaming

我正在尝试使用事件时间窗口对结构化流进行自定义聚合 首先,我尝试使用带有.agg函数的#Aggregator接口(typed-UDAF),如:

val aggregatedDataset = streamDataset
  .select($"id",$"time", $"eventType", $"eventValue"))
  .groupBy(window($"time", "1 hour"), $"id").agg(CustomAggregator("time","eventType","eventValue").toColumn.as("aggregation"))

然而,这种聚合(在reduce函数中)仅适用于新的输入元素,而不是整个组

所以我试图使用GroupState函数(mapGroupsWithState,flapMapGroupWithState),甚至只是mapGroups函数(没有状态)来执行我的聚合

但我的groupBy操作返回RelationalGroupedDataset,我需要一个KeyValueGroupedDataset来使用map函数。 groupByKey不适用于窗口。

如何设法使用结构化流媒体和定时事件进行自定义聚合?

谢谢!

1 个答案:

答案 0 :(得分:0)

GroupState函数 - flapMapGroupWithStatemapGroupsUpdate(没有状态)仅在我们需要在Complete中操作时用于执行聚合输出模式。

但是如果我们使用aggregatedDataset输出模式,那么我们不需要GroupState函数。

因此,如果您将Complete查询的输出模式更改为{{1}},那么它将按预期工作。

我希望它有所帮助!