这似乎是一个非常天真的问题,但我无法在任何地方找到答案。
我使用Spark RDD将非常大的TSV文件转换为两组键值对,以加载到分布式键值存储中。我没有使用DataFrame,因为TSV没有遵循非常明确的模式,稀疏矩阵是更好的模型。
一组键值对表示Entity-Attribute-Value模型中的原始数据,另一组键值和值从第一组转换为Attibute-Value-Entity模型(?)我猜 - 我刚刚完成这个术语。
我的伪代码大致是,
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-实体对通过RDD单次传递,即使它会使代码更不易读?
答案 0 :(得分:3)
是和否。由于基本RDD被缓存,因此第一个映射将加载它并将其放入内存。第二个映射将需要一个新的迭代,因为它是原始RDD的单独分支。但是,这次将从缓存中读取原始RDD。