【问题标题】:Spark (Java): Get Filename/Content pairs from a list of file namesSpark(Java):从文件名列表中获取文件名/内容对
【发布时间】:2015-03-11 20:56:16
【问题描述】:

我目前正在使用 Java 开发 Spark 项目,但遇到了一个不知道如何解决的问题。我不熟悉各种加入/联合方法,所以我认为其中一种方法就是答案。

我目前想输入一个文件名(或路径)列表并获取一个 JavaPairRDD 对象,该对象由文件名/路径和文本内容对组成。

我知道我可以使用标准 Java 来获取文本内容并只需输入文件名内容元组列表,但我觉得必须有一种“Spark”方式来做到这一点。

我也知道有一个 wholeTextFile 方法,但它只抓取目录中的所有内容,我不确定这将是我得到的格式(例如,我可能使用 Amazon S3,我不确定我是否可以制作关于那里的目录的假设)。

此外,我知道我可以在一个循环中单独并行化每个文件,但是如何将它们重新组合在一起?

docs = //List<String> of document filenames
JavaRDD<String> documents = sc.parallelize(docs);
JavaPairRDD<String, String> = documents.???

提前致谢。

编辑:我很想创建一个&lt;Filename, JavaRDD&lt;String&gt; filecontents&gt; 的JavaPairRDD,但我不确定如何从那里开始。我也对此保持警惕,因为它听起来是错误的(即我是否以某种方式覆盖了并行性?)。

我知道我可以让 Spark 从每个文档中创建一个 JavaRDD 对象,将它们转换为 List 对象,然后将它们作为元组提供,但是有 Spark 特定的方法吗?

编辑 2 显然,我误解了如何将文本文件加载到 JavaRDD 对象中。他们不会将整个字符串作为一个对象加载,而是逐行分解。这让我重新思考我的方法,因为出于各种原因,我确实需要打破界限。所以我想我必须采用“hackish”方法,即使用 spark 加载文件,然后将其转换回 List。但是,如果有人对此有聪明的解决方案,我会留下这个问题。

【问题讨论】:

    标签: java apache-spark rdd


    【解决方案1】:

    我将改用 wholeTextFiles(),因为我在尝试将数据转换为正确格式时遇到了越来越多的问题。

    也就是说,我实际上并不希望将文件分成几行,我想自己以一种特殊的方式将其分解。

    【讨论】:

    • 我不得不切换回去,wholeTextFiles() 与 Amazon S3 有问题。
    【解决方案2】:

    如果您使用 wholeTestFiles() 方式,它不会立即读取整个数据,然后在您的独立 Spark 集群/工作人员上并行化它吗?您的驱动程序代码需要在更高的内存上运行。

    【讨论】:

      【解决方案3】:

      在 Scala 中,您可以使用以下查询获取文件名 spark stream 或 spark sc:

      object GetFileNameFromStream extends java.io.Serializable {
         def getFileName(file: RDD[String]) :String ={
         file.toDebugString
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 2017-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        • 2020-02-10
        相关资源
        最近更新 更多