我想知道一些与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)处理多个键的总和。
谢谢您的帮助。
答案 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) ...)
}
});