我通读了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
具有从Iterator
到Iterator
的功能。
通常,如果您使用引用数据,则可以将mapPartitions
替换为map
并使用静态成员来存储数据。这将具有相同的占用空间,并且更易于编写。