2016-11-15 58 views
0

我有一個自定義RichCoFlatMapFunction,它使用ValueState成員。該文檔說Apache Flink:ConnectedStreams中的ValueState範圍

鍵/值接口的作用域是當前輸入元素的鍵

https://ci.apache.org/projects/flink/flink-docs-master/dev/state.html#using-the-keyvalue-state-interface

如果所連接的流這樣的I鍵:

val connected = streamA 
    .connect(streamB) 
    .keyBy(a=>a.foo, b=>b.bar) 
    .flatMap(new MyRichCoFlatMapFunction) 

那麼語義如何呢?第一個,第二個還是兩者的組合都是關鍵的?

回答

2

keyBya => a.foo)的第一個參數定義了第一個流的鍵(streamA)。第二個參數(b => b.bar)是第二個流的關鍵(streamB)。兩個參數都必須返回相同類型的密鑰,即a.foob.bar的類型必須相同。

然後連接運營商將發送所有記錄從streamAstreamB與相同的運算符相同的密鑰。有狀態RichCoFlatMapFunction將爲當前元素的鍵設置ValueState,即,如果flatMap1(a: TypeA, out: Collector[TypeOut])被調用的值爲streamA,則爲鍵a.foo設置狀態,並且如果調用flatMap2(b: TypeB, out: Collector[TypeOut])的值爲streamB的值,則設置狀態鑰匙b.bar