Apache Flink:keyby和窗口运算符

时间:2018-10-26 02:51:37

标签: apache-flink apache-storm flink-streaming

我想知道一些与keyedstream相关的机制。 代码如下:

DataStream<Tuple2<String, Integer>> counts =
            // split up the lines in pairs (2-tuples) containing: (word,1)
            text.flatMap(new Tokenizer())
            // group by the tuple field "0" and sum up tuple field "1"
                    .keyBy(0)
                    .window(TumblingProcessingTimeWindows.of(Time.seconds(3)))

如果我想实现窗口字数统计。

Q1:每个窗口中只有一个键还是多个键?

Q2:对于窗口中的功能,我仅使用简单的sum ++或需要通过窗口中的哈希映射(例如Apache Storm)处理多个键的总和。

谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

即使每个窗口实际上有多个键,对process / reduce / sum / aggregate函数的每次调用都是使用具有相同键的元素进行的。

在您的示例中,您可以只使用sum,Flink会处理所有事情:

text.flatMap(new Tokenizer())
      .keyBy(0)
      .window(TumblingProcessingTimeWindows.of(Time.seconds(3)))
      .sum(X)

如果您选择使用reduce来代替...

text.flatMap(new Tokenizer())
      .keyBy(0)
      .window(TumblingProcessingTimeWindows.of(Time.seconds(3)))
      .reduce(new ReduceFunction<Tuple2<String, Integer>>(){
            @Override
            public Tuple2<String, Integer> reduce(final Tuple2<String, Integer> first, final Tuple2<String, Integer> second) {
                  (... do something with the guarantee that first[0] == second[0] (same key) ...)
            }
      });