我刚从Spark& amp;阶
我有一个包含多个文件的目录 我使用
成功加载它们sc.wholeTextFiles(directory)
现在我想升级一级。我实际上有一个目录,其中包含包含文件的子目录。我的目标是获得RDD[(String,String)]
,以便我可以前进,RDD
代表文件的名称和内容。
我尝试了以下内容:
val listOfFolders = getListOfSubDirectories(rootFolder)
val input = listOfFolders.map(directory => sc.wholeTextFiles(directory))
但我得到了Seq[RDD[(String,String)]]
如何将此Seq
转换为RDD[(String,String)]
?
或许我做得不对,我应该尝试不同的方法?
修改:添加了代码
// HADOOP VERSION
val rootFolderHDFS = "hdfs://****/"
val hdfsURI = "hdfs://****/**/"
// returns a list of folders (currently about 800)
val listOfFoldersHDFS = ListDirectoryContents.list(hdfsURI,rootFolderHDFS)
val inputHDFS = listOfFoldersHDFS.map(directory => sc.wholeTextFiles(directory))
// RDD[(String,String)]
// val inputHDFS2 = inputHDFS.reduceRight((rdd1,rdd2) => rdd2 ++ rdd1)
val init = sc.parallelize(Array[(String, String)]())
val inputHDFS2 = inputHDFS.foldRight(init)((rdd1,rdd2) => rdd2 ++ rdd1)
// returns org.apache.spark.SparkException: Job aborted due to stage failure: Task serialization failed: java.lang.StackOverflowError
println(inputHDFS2.count)
答案 0 :(得分:4)
您可以减少Seq
这样的结果(将RDD
与++
连接起来):
val reduced: RDD[(String, String)] = input.reduce((left, right) => left ++ right)
还有一些细节,为什么我们可以在这里应用reduce:
++
是关联的 - 你rdda ++(rddb ++ rddc)或(rdda ++ rddb)++ rddc Seq
是非空的(否则fold
将是更好的选择,它需要空RDD[(String, String)]
作为初始累加器。)根据Seq
的确切类型,您可能会获得堆栈溢出,因此请小心并使用更大的集合进行测试,但对于标准库我认为它是安全的。
答案 1 :(得分:3)
您应该使用spark context
提供的union
val rdds: Seq[RDD[Int]] = (1 to 100).map(i => sc.parallelize(Seq(i)))
val rdd_union: RDD[Int] = sc.union(rdds)
答案 2 :(得分:2)
您可以使用路径通配符将所有目录加载到单个RDD中,而不是将每个目录加载到单独的RDD中吗?
给出以下目录树...
$ tree test/spark/so
test/spark/so
├── a
│ ├── text1.txt
│ └── text2.txt
└── b
├── text1.txt
└── text2.txt
使用目录的通配符创建RDD。
scala> val rdd = sc.wholeTextFiles("test/spark/so/*/*")
rdd: org.apache.spark.rdd.RDD[(String, String)] = test/spark/so/*/ WholeTextFileRDD[16] at wholeTextFiles at <console>:37
计数是4,正如您所期望的那样。
scala> rdd.count
res9: Long = 4
scala> rdd.collect
res10: Array[(String, String)] =
Array((test/spark/so/a/text1.txt,a1
a2
a3), (test/spark/so/a/text2.txt,a3
a4
a5), (test/spark/so/b/text1.txt,b1
b2
b3), (test/spark/so/b/text2.txt,b3
b4
b5))