以下代码块之间的性能差异是什么?
1.FlatMapToPair:这个代码块使用单个转换,但基本上有一个过滤条件,它返回一个空列表,技术上不允许RDD中的这个元素继续进行
rdd.flatMapToPair(
if ( <condition> )
return Lists.newArrayList();
return Lists.newArrayList(new Tuple2<>(key, element));
)
2. [Filter + MapToPair]这个代码块有两个转换,第一个转换只是使用与上面的代码块相同的条件进行过滤,但是在过滤器之后进行另一个转换mapToPair。
rdd.filter(
(element) -> <condition>
).mapToPair(
(element) -> new Tuple2<>(key, element)
)
Spark是否足够智能,无论转换次数如何,都可以对这两个代码块执行相同的操作,或者在代码块2中执行情况更糟,因为这些是两次转换?
由于
答案 0 :(得分:3)
实际上,Spark会在第一种情况下表现更差,因为它必须初始化然后为每条记录垃圾收集新的ArrayList
。在大量记录中,它可能会增加大量开销。
否则Spark“足够智能”使用惰性数据结构,并将多个转换组合在一起,不需要随机播放。
在某些情况下,显式合并不同的转换是有益的(要么减少初始化对象的数量,要么保持较短的谱系),但这不是其中之一。