2017-08-09 64 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