【问题标题】:Can Spark optimize multiple passes through an RDD?Spark 可以通过 RDD 优化多次传递吗?
【发布时间】:2016-05-18 05:04:40
【问题描述】:

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

我正在使用 Spark RDD 将一个非常大的 TSV 文件转换为两组键值对,以加载到分布式键值存储中。我没有使用 DataFrames,因为 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 进行两次迭代吗? 尝试同时生成实体-属性和属性-实体对会更好吗?一次通过 RDD,即使它会使代码的可读性大大降低?

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:

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

    【讨论】:

    • 谢谢贾斯汀。我明白你的意思了。 “分支”。如果我这样做了, val entityAttrPairs = orig.mapPartitions(...); val attrEntityPairs = entityAttrPairs.mapPartitions(...),即。一个链而不是一个分支,这是否允许 Spark 优化通过 RDD 的次数?
    • 是的,它会将两者组合在一起。
    猜你喜欢
    • 1970-01-01
    • 2017-02-02
    • 2014-12-22
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    相关资源
    最近更新 更多