我在一个时间窗口计算一个计数(求和1),如下所示:
apt-get clean
我想将窗口开始时间实际添加为关键字段。所以结果会是这样的:
mappedUserTrackingEvent
.keyBy("videoId", "userId")
.timeWindow(Time.seconds(30))
.sum("count")
所以基本上是窗口的聚合计数。最终目标是绘制这些窗口的直方图。
如何将窗口的开头添加为键中的字段?并且在这种情况下将窗口对齐到00s或30s?这可能吗?
答案 0 :(得分:4)
apply()
的{{1}}方法提供WindowFunction
对象,如果您使用Window
,则为TimeWindow
。 keyBy().timeWindow()
对象有两个方法TimeWindow
和getStart()
,它们分别返回窗口开始和结束的时间戳。
目前无法将getEnd()
聚合与sum()
一起使用。您需要执行以下操作:
WindowFunction
mappedUserTrackingEvent
.keyBy("videoId", "userId")
.timeWindow(Time.seconds(30))
.apply(new MySumReduceFunction(), new MyWindowFunction());`
实现MySumReduceFunction
接口,并通过逐步聚合到达窗口的元素来计算总和。 ReduceFunction
实施MyWindowFunction
。它通过WindowFunction
参数接收聚合值,并使用从Iterable
参数获取的时间戳来丰富该值。
答案 1 :(得分:2)
您可以使用aggregate
方法代替sum
在aggregate
设置第二个参数实现WindowFunction
或扩展ProcessWindowFunction
我使用的是Flink-1.4.0,建议使用ProcessWindowFunction
,例如:
mappedUserTrackingEvent
.keyBy("videoId", "userId")
.timeWindow(Time.seconds(30))
.aggregate(new Count(), new MyProcessWindowFunction();
public static class MyProcessWindowFunction extends ProcessWindowFunction<Integer, Tuple2<Long, Integer>, Tuple, TimeWindow>
{
@Override
public void process(Tuple tuple, Context context, Iterable<Integer> iterable, Collector<Tuple2<Long, Integer>> collector) throws Exception
{
context.currentProcessingTime();
context.window().getStart();
}
}