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" 使用惰性数据结构并将不需要混洗的多个转换组合到一个阶段中。

在某些情况下,不同转换的显式合并是有益的(减少初始化对象的数量或保持较短的沿袭),但这不是其中之一。