我在理解流方面有困难,以工作计数为例,对于像 Kafka 这样的无限源,"总和"到底有什么作用?
DataStream<Tuple2<String, Long>> counts = input
......
.returns(Types.TUPLE(Types.STRING, Types.LONG))
.keyBy(0)
.sum(1);
当有时间窗口时,我有点理解它,它对我来说就像一个"批处理",因为它有开始和结束时间,但是当根本没有时间窗口时,
- 开始时间和结束时间是什么?
- 当 Flink 第 3 次收到单词 'foo' 时,"sum"会遍历所有旧的 'foo',做 1+1+1,并给出结果 '3'。或者,Flink 在上一步以某种方式保存了一个中间结果"2",所以"总和"只做 2+1?
- 有没有另一种方法来做求和,我的意思是,使用 keyBy(0).process(...) 或其他东西?
指定的程序将转换为带有SumAggregator
的StreamGroupedReduce
。StreamGroupedReduce
要做的是不断减少传入的数据流,并在每条传入记录后输出新的减少值。
在内部,StreamGroupedReduce
使用保持电流降低值的ValueState
。每当有新记录到达时,通过调用ReduceFunction
将当前归约值与传入记录合并(在您的情况下为SumAggregator
)。然后,此操作的结果存储在操作员的ValueState
中,并输出给下游消费者。
例如:输入流1, 2, 3, 4, 5
在求和时将生成以下输出:1, 3, 5, 9, 14
。
如果需要,则可以使用keyBy(0).process(...)
实现相同的行为。