我通读了map和mapPartitions之间的理论差异,并且很清楚何时在各种情况下使用它们。

但是我下面描述的问题更多是基于GC Activity 和内存(RAM)。有关问题,请阅读以下内容:

=>我编写了一个map函数,将Row转换为String。因此,RDD [org.apache.spark.sql.Row]的输入将映射到RDD [String]。但是通过这种方法,将为RDD的每一行创建映射对象。因此,创建如此大量的对象可能会增加GC Activity 。

=>要解决以上问题,我想到了使用mapPartitions。因此,该对象数等于分区数。 mapPartitions提供Iterator作为输入,并接受return和java.lang.Iterable。但是大多数Iterable(例如Array,List等)都在内存中。那么,如果我有大量数据,那么以这种方式创建Iterable会导致内存不足吗?还是在这里应该使用其他任何集合(java或scala)(以防万一内存开始填充到磁盘上)?还是仅在RDD完全在内存中的情况下才使用mapPartitions?

提前致谢。任何帮助将不胜感激。

最佳答案

如果您考虑使用JavaRDD.mapPartitions,则需要使用FlatMapFunction(或类似DoubleFlatMapFunction的某些变体),该方法应返回Iterator而不是Iterable。如果底层收集很懒,那么您就不必担心。
RDD.mapPartitions具有从IteratorIterator的功能。

通常,如果您使用引用数据,则可以将mapPartitions替换为map并使用静态成员来存储数据。这将具有相同的占用空间,并且更易于编写。

07-27 23:27