【问题标题】:Nested use of sc.textFile inside an RDD在 RDD 中嵌套使用 sc.textFile
【发布时间】:2016-10-23 04:26:43
【问题描述】:

我需要使用 Spark 来处理基于查询另一个索引的大量文本文件中的数据。我可以在小情况下执行此操作(通过将 RDD 转换为数组/见下文),但很难将其设置为正确处理大量数据。

我有这个:

val rootPath = "..."
val ndxRDD = sc.textFile(rootPath + "index/2016-09-01*")

def ndxToDoc(articleName: String): String = { sc.textFile(rootPath + articleName).first(); }

// works
val artcilesArr = ndxRDD.collect().map(ndxToDoc);
val articlesRDD = sc.parallelize(articlesArr)

// does not work
// val articlesRDD = ndxRDD.map(ndxToDoc)

articlesRDD.count()

我认为问题在于我正在尝试读取 rdd 中的文件。如何在没有中间 collect() - map -> textFile() - parallelize() 设置的情况下完成上述工作?

提前致谢!

【问题讨论】:

  • 只是为了确保我理解您的用例 - 您有一个包含数十亿其他文件名称的文本文件,您想要加载?另外你使用的是什么版本的 Spark?
  • 我有数十亿个文本文件(本质上是一个索引),其中包含数十亿个其他文件的名称。我使用的是 Spark 1.6,但如果需要,可以轻松升级到 Spark 2.0。

标签: scala apache-spark


【解决方案1】:

我认为这是此类任务的最佳方法。它是您需要的用例!

您必须将它收集为一个列表,否则您必须在 RDD 中创建一个 RDD,这在 Spark 的当前实现中是不可能的。

关于为什么我们不能在 RDD 中创建 RDD 的更多信息,请看这里:

  1. Spark-Google-Group Discussion

  2. SPARK-NestedRDD

因此这是一种最佳方法,尽管我可以建议您可以使用 OFFHeap 内存将大型对象存储在内存中

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 2014-07-12
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2018-11-09
    • 2018-04-28
    • 1970-01-01
    相关资源
    最近更新 更多