2017-01-03 85 views
0

我需要將無限的鍵值元素的PCollection摺疊到每個鍵集合(在每個輸入應用後輸出集合)。重要的是將值按正確的順序進行摺疊,並且它不像自定義組合器所支持的那樣。每個密鑰的吞吐量將會很低,但整體吞吐量會非常高。有沒有辦法讓我在Dataflow中做到這一點?將元素摺疊爲值

回答

2

正確,合成器是無序的。這是因爲無序組合在Beam模型中有很大的意義,它允許後期數據(在你的情況下,你希望什麼樣的行爲,以防遲到的數據到達?),並且因爲它承認非常有效的實現,並且在大多數情況下,這是所有需要的。你可以解決這個問題對於你的情況

的一種方式,犧牲一些效率,是實現自定義CombineFn,其中:

  • 的蓄能器,以及輸出類型,是「排序輸入的元素列表時間戳」。
  • 將元素插入累加器將其插入排序列表中
  • 合併兩個累加器會合並排序列表。
  • 從累加器提取輸出是身份函數。

基本上你將使用聯合維護每個鍵值的排序列表,你會得到一個PCollection<KV<K, List<V>>>,到可以應用ParDo與貴了一倍。

+0

聽起來好像會起作用,但隨着時間的推移,這個州會不斷增長 - 我希望有一個解決方案,我只需要保持聚集狀態。 –

+0

我認爲對於我的用例,可以按照處理時間順序應用事件 - 所以我不必遲到,因爲遲到事件只會在接收時打開的窗口中進行,對嗎? –

+0

因此:鑑於即將推出的國家API(BTW即將推出?:-D),我將能夠擁有一個ParDo,它可以將每個鍵的當前狀態保留在全局窗口中,並且只需在事件進入時應用......除非那裏也沒有訂購,在這種情況下,我必須(我認爲)1)根據處理時間保留固定的時間窗口; 2)GroupByKey; 3)進入一個新的全球窗口;和4)ParDo排序並應用事件。我認爲。 –