Spark(Java):从文件名列表中获取文件名/内容对

时间:2015-03-11 20:56:16

标签: java apache-spark rdd

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

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

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

我也知道有一个fullTextFile方法,但只抓取目录中的所有内容,我不确定这是我得到的格式(我可能会使用Amazon S3,我不确定如果我可以对那里的目录做出假设。)

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

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

提前致谢。

编辑:我很想创建<Filename, JavaRDD<String> filecontents>的JavaPairRDD,但我不确定如何从那里开始。我也对此保持警惕,因为它听起来不对(即我是否以某种方式压倒了并行性?)。

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

编辑2 显然,我误解了文本文件是如何加载到JavaRDD对象中的。它们不会将整个字符串作为一个对象加载,它们会逐行分解。这让我重新思考我的方法,因为我确实需要通过各种原因来划分界限。因此,我认为我必须选择&#34; hackish&#34;使用spark加载文件然后将其转换回List的方法。但是,如果有人有一个聪明的解决方案,我会留下这个问题。

3 个答案:

答案 0 :(得分:0)

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

即,我实际上并不想将这些文件分成几行,我想以一种特殊的方式将其分解。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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