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

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