我没有清楚地了解MapPartition。请有人解释一下Mappartition的一些用例以及它与FlatMap的不同之处?
答案 0 :(得分:4)
区别在于方法的界面以及它们的调用方式。
FlatMapFunction
为每条记录调用flatMap(IN val, Collector<OUT> out)
方法,并为每条输入记录发出0
,1
或更多记录。因此,FlatMapFunction
进程逐个记录。它不应该跨函数调用保持状态。MapPartitionFunction
的{{1}}方法只调用一次,并在所有分区上接收迭代器。它可以为整个分区发出mapPartition(Iterable<IN> vals, Collector<OUT> out)
,0
或更多记录。因此,1
可以(原则上)收集整个分区并计算结果。但是,如果分区很大,这可能很危险,因为您可以轻松地运行内存。如果首先对分区进行排序,mapPartition通常很有用。 因此,一般来说,MapPartitionFunction
更通用,可以完成mapPartition
所做的所有事情。然而,与许多强大的工具一样,你需要更加小心,因为你可以自己开枪。 flatMap
界面更安全(通常更容易)使用。
答案 1 :(得分:0)
在Apache Flink中,您可以使用
DataSet
或DataStream
flatMap
是对两个
.flatMap(new Tokenizer()) // calling on each record
.flatMap(String value, Collector<Tuple2<String, Integer>> out) //definition
而,
mapPartition
是每个分区上的一个map和for循环,直到Key的分区中的所有记录都被处理
DataStream在API中没有mapPartition
有关详细信息,请参阅this post