2017-08-09 54 views

回答

3

區別在於方法的接口以及它們如何被調用。

  • FlatMapFunctionflatMap(IN val, Collector<OUT> out)方法被稱爲對於每個記錄,並且可以發射01,或多個記錄對於每個輸入記錄。因此,一個FlatMapFunction進程記錄一個接一個。它不應該在函數調用中保持狀態。
  • MapPartitionFunctionmapPartition(Iterable<IN> vals, Collector<OUT> out)方法被調用一次,並接收所有分區的迭代器。它可以爲整個分區發出0,1或更多記錄。因此,MapPartitionFunction可以(原則上)收集整個分區並計算結果。但是,如果分區很大,這可能很危險,因爲您可以輕鬆地運行內存不足。如果首先對分區進行排序,mapPartition通常很有用。

因此,一般而言,mapPartition是更通用的,可以做所有flatMap所做的一切和更多。然而,就像許多強大的工具一樣,你需要更加小心,因爲你可以在腳下自己射擊。接口更安全(通常更易於使用)。

+0

感謝費邊。所以一般來說mapPartition在性能方面應該比flatMap快嗎?正如你解釋mapParition收集整個分區,在這裏我有一個疑問,因爲我的理解,在flink中的map沒有取決於分裂,它取決於並行性。所以如果並行度低於不是。的分割比一些mapPartition將分配多個輸入分割。所以它作爲一個單一的可迭代收集的所有分割意味着多個分割創建一個輸入分區。 –

+0

Flink中的拆分和分區不相同。運算符的每個並行實例處理一個分區,即分區可能由多個分割組成。 MapPartition不會**收集內存中的所有數據(除非您的用戶函數這樣做)。分區通過Iterable進行流式傳輸。它可能比flatMap更有效一些,但正如我所說的,你必須小心。如果你沒有明確地分割你的數據,結果可能是非確定性的。 –

+0

太棒了。請給我詳細說明如何將分割分配給分區,如果我沒有明確分區我的數據,並且沒有.of分區與運算符的並行性相同。 –

0

在Apache中弗林克您可以在任一DataSetDataStream

flatMap是在任的兩個

.flatMap(new Tokenizer()) // calling on each record 
.flatMap(String value, Collector<Tuple2<String, Integer>> out) //definition 

,而每條記錄的函數調用行爲,

mapPartition是一個映射,並在每個分區上循環,直到參數中的所有記錄天信一鍵處理

的數據流中沒有可用mapPartition的API

在欲瞭解更多信息請閱讀說明this post