我無法理解流式傳輸,以工作計數(shù)為例,對于像 Kafka 這樣的無限源,“sum”到底是做什么的?DataStream<Tuple2<String, Long>> counts = input
......
.returns(Types.TUPLE(Types.STRING, Types.LONG))
.keyBy(0)
.sum(1);當(dāng)有時間窗口時我有點(diǎn)理解,對我來說就像一個“批次”,因?yàn)樗虚_始和結(jié)束時間,但是當(dāng)根本沒有時間窗口時,開始時間和結(jié)束時間是什么時候?當(dāng) Flink 第三次接收到單詞 'foo' 時,'sum' 是否會遍歷所有舊的 'foo',做 1+1+1,并給出結(jié)果 '3'?;蛘撸現(xiàn)link 以某種方式在上一步中保存了一個中間結(jié)果 '2',所以 'sum' 只做 2+1?有沒有另一種方法來求和,我的意思是,使用 keyBy(0).process(...) 什么的?
1 回答

jeck貓
TA貢獻(xiàn)1909條經(jīng)驗(yàn) 獲得超7個贊
指定的程序?qū)⑥D(zhuǎn)換為StreamGroupedReduce
帶有SumAggregator
. 它將做的StreamGroupedReduce
是不斷減少傳入的數(shù)據(jù)流并在每個傳入記錄之后輸出新的減少值。
在內(nèi)部,StreamGroupedReduce
使用 aValueState
來保持當(dāng)前的減少值。每當(dāng)有新記錄到達(dá)時,當(dāng)前的 reduce 值都會通過調(diào)用ReduceFunction
(在您的情況下SumAggregator
)與傳入記錄相結(jié)合。然后,此操作的結(jié)果存儲在操作員中ValueState
并輸出到下游消費(fèi)者。
例如:輸入流1, 2, 3, 4, 5
在求和時會產(chǎn)生如下輸出:1, 3, 5, 9, 14
.
如果需要,您可以使用keyBy(0).process(...)
.
添加回答
舉報
0/150
提交
取消