【发布时间】:2017-08-09 07:10:41
【问题描述】:
我对 MapPartition 的理解不是很清楚。请有人解释一下 Mappartition 的一些用例以及它与 FlatMap 有何不同?
【问题讨论】:
标签: hadoop apache-flink
我对 MapPartition 的理解不是很清楚。请有人解释一下 Mappartition 的一些用例以及它与 FlatMap 有何不同?
【问题讨论】:
标签: hadoop apache-flink
区别在于方法的接口和调用方式。
FlatMapFunction 的flatMap(IN val, Collector<OUT> out) 方法,并且可以为每条输入记录发出0、1 或更多记录。因此,FlatMapFunction 处理记录一个接一个。它不应该跨函数调用保持状态。MapPartitionFunction 的 mapPartition(Iterable<IN> vals, Collector<OUT> out) 方法只被调用一次,并在所有分区上接收一个迭代器。它可以为整个分区发出0、1 或更多记录。因此,MapPartitionFunction 可以(原则上)收集整个分区并计算结果。但是,如果分区很大,这可能很危险,因为您很容易耗尽内存。如果您首先对分区进行排序,则 mapPartition 通常很有用。 所以,一般来说,mapPartition 更通用,可以做flatMap 所做的一切,甚至更多。但是,与许多强大的工具一样,您需要更加小心,因为您可能会在自己的脚下开枪。 flatMap 接口使用起来更安全(通常也更容易)。
【讨论】:
在 Apache Flink 中,您可以对
DataSet或DataStream执行操作
flatMap 是对两者之一的每条记录的函数调用
.flatMap(new Tokenizer()) // calling on each record
.flatMap(String value, Collector<Tuple2<String, Integer>> out) //definition
而,
mapPartition 是每个分区上的一个映射和 for 循环,直到处理完一个 Key 的分区中的所有记录
DataStream 在 API 中没有可用的 mapPartition
更多信息请阅读this post
【讨论】: