猪猪吧博客2 技术 JAVA 正文

Flink 窗口滚动和滑动操作

Flink存在两种窗口操作,分别为滚动操作和滑动操作,两者主要的区别在于,滚动操作不会重叠,而滑动操作则会让数据产生重叠

窗口需求


在Streaming应用程序的情况下,数据是连续的,因此我们不能等待在开始处理之前流式传输整个数据。当然,我们可以处理每个传入的事件,然后转移到下一个事件,但在某些情况下,我们需要对传入的数据进行某种聚合 - 例如,有多少用户在过去10分钟内点击了您网页上的链接。在这种情况下,我们必须定义一个窗口并对窗口内的数据进行处理


DataStream<List<OggData<JSONObject>>> window = waterMarkStream.keyBy(0)
//.window(TumblingEventTimeWindows.of(Time.seconds(10),Time.seconds(5)))//滚动窗口,不重叠;按照消息的EventTime分配窗口,和调用TimeWindow效果一样
       .window(SlidingProcessingTimeWindows.of(Time.seconds(10),Time.seconds(5)))//滑动窗口,有重叠
       .apply(new WindowFunction<Tuple2<String, OggData<JSONObject>>, List<OggData<JSONObject>>, Tuple, TimeWindow>() {
/**
            * 对window内的数据进行排序,保证数据的顺序
            * @param tuple
            * @param window
            * @param input
            * @param out
            * @throws Exception
            */
           @Override
           public void apply(Tuple tuple, TimeWindow window, Iterable<Tuple2<String, OggData<JSONObject>>> input, Collector<List<OggData<JSONObject>>> out) throws Exception {
//String key = tuple.toString();
               SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Iterator it = input.iterator();
List<OggData<JSONObject>> wait = new LinkedList<>();
System.out.println("-------"+sdf.format(window.getStart()) +"------");
while (it.hasNext()) {
Tuple2<String, OggData<JSONObject>> tuple2 = (Tuple2<String, OggData<JSONObject>>) it.next();
String op_ts = tuple2.f1.getOp_ts();
System.out.println(op_ts);
wait.add(tuple2.f1);
}
System.out.println("-------"+sdf.format(window.getEnd())+"------");
Collections.sort(wait, new Comparator<OggData>() {
@Override
                   public int compare(OggData u1, OggData u2) {
long diff = DateTimeUtils.getTimeStamp(u1.getOp_ts()) - DateTimeUtils.getTimeStamp(u2.getOp_ts());
if (diff > 0) {
return 1;
} else if (diff < 0) {
return -1;
}
return 0; //相等为0
                   }
}); // 按操作时间排序
               //这里我们可以对两张表数据进行合并输出。


               out.collect(wait);
}
});
//测试-把结果打印到控制台即可
window.print();


本文转载自互联网,版权归原作者所有,转载目的在于传递更多的信息,并不代表本网站的观点和立场。 如发现本站文章存在内容、版权或其它问题,烦请联系,我们将及时删除。

评论列表

    快捷回复: