Flink timeWindow获取开始时间

时间:2016-09-16 16:43:52

标签: apache-flink flink-streaming

我在一个时间窗口计算一个计数(求和1),如下所示:

apt-get clean

我想将窗口开始时间实际添加为关键字段。所以结果会是这样的:

mappedUserTrackingEvent
            .keyBy("videoId", "userId")
            .timeWindow(Time.seconds(30))
            .sum("count")

所以基本上是窗口的聚合计数。最终目标是绘制这些窗口的直方图。

如何将窗口的开头添加为键中的字段?并且在这种情况下将窗口对齐到00s或30s?这可能吗?

2 个答案:

答案 0 :(得分:4)

apply()的{​​{1}}方法提供WindowFunction对象,如果您使用Window,则为TimeWindowkeyBy().timeWindow()对象有两个方法TimeWindowgetStart(),它们分别返回窗口开始和结束的时间戳。

目前无法将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();
    }
}