我正在尝试使用事件时间窗口对结构化流进行自定义聚合 首先,我尝试使用带有.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不适用于窗口。
如何设法使用结构化流媒体和定时事件进行自定义聚合?
谢谢!
答案 0 :(得分:0)
GroupState函数 - flapMapGroupWithState
,mapGroups
或Update
(没有状态)仅在我们需要在Complete
中操作时用于执行聚合输出模式。
但是如果我们使用aggregatedDataset
输出模式,那么我们不需要GroupState函数。
因此,如果您将Complete
查询的输出模式更改为{{1}},那么它将按预期工作。
我希望它有所帮助!