Spark flatMapToPair 与 [filter + mapToPair]
Spark flatMapToPair vs [filter + mapToPair]
以下代码块之间的性能差异是什么?
1.FlatMapToPair:此代码块使用单个转换,但基本上在其中包含过滤条件,其中 returns 是一个空列表,技术上不允许 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 中执行更差,因为这是两个转换?
谢谢
实际上,在第一种情况下,Spark 的性能会更差,因为它必须初始化,然后对每条记录进行垃圾回收 ArrayList
。对于大量记录,它会增加大量开销。
否则 Spark "intelligent enough" 使用惰性数据结构并将不需要混洗的多个转换组合到一个阶段中。
在某些情况下,不同转换的显式合并是有益的(减少初始化对象的数量或保持较短的沿袭),但这不是其中之一。
以下代码块之间的性能差异是什么?
1.FlatMapToPair:此代码块使用单个转换,但基本上在其中包含过滤条件,其中 returns 是一个空列表,技术上不允许 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 中执行更差,因为这是两个转换?
谢谢
实际上,在第一种情况下,Spark 的性能会更差,因为它必须初始化,然后对每条记录进行垃圾回收 ArrayList
。对于大量记录,它会增加大量开销。
否则 Spark "intelligent enough" 使用惰性数据结构并将不需要混洗的多个转换组合到一个阶段中。
在某些情况下,不同转换的显式合并是有益的(减少初始化对象的数量或保持较短的沿袭),但这不是其中之一。