Spark 可以优化通过 RDD 的多次传递吗?

Can Spark optimize multiple passes through an RDD?

这似乎是一个非常幼稚的问题,但我无法在任何地方找到直接的答案。

我正在使用 Spark RDD 将一个非常大的 TSV 文件转换为两组键值对,以加载到分布式键值存储中。我没有使用 DataFrame,因为 TSV 没有遵循定义明确的模式,稀疏矩阵是更好的模型。

一组键值对表示 Entity-Attribute-Value 模型中的原始数据,另一组将第一组中的键和值转置到属性值实体模型中(?)我猜- 我刚刚编造了这个词。

我的伪代码大致是,

val orig: RDD[String] = sc.textFile("hdfs:///some-file.tsv").cache
val entityAttrPairs = orig.mapPartitions(convertLinesToKVPairs)
val attrEntityPairs = orig.mapPartitions(convertLinesToIndexKVPairs)
entityAttrPairs.saveAsNewAPIHadoopFile("hdfs:///ready-for-ingest/entity-attr")
attrEntityPairs.saveAsNewAPIHadoopFile("hdfs:///ready-for-ingest/attr-entity")

我的问题是:mapPartitions 的单独调用是否会导致 Spark 对整个 RDD 进行两次迭代? 我最好不要同时生成实体-attr 和 attr-entity 对通过 RDD 一次传递,即使它会使代码的可读性大大降低?

是也不是。由于基本 RDD 已缓存,因此第一个映射将加载它并将其放入内存。第二个映射将需要一个新的迭代,因为它是原始 RDD 的一个单独分支。但是,这次将从缓存中读取原始 RDD。