我有scala代码,它使用通配符从HDFS获取多个输入文件,每个文件都进入一个函数,每个文件都单独进行处理。
import de.l3s.boilerpipe.extractors.KeepEverythingExtractor
val data = sc.wholeTextFiles("hdfs://localhost:port/akshat/folder/*/*")
val files = data.map { case (filename, content) => filename}
def doSomething(file: String): (String,String) = {
// logic of processing a single file comes here
val logData = sc.textFile(file);
val c = logData.toLocalIterator.mkString
val d = KeepEverythingExtractor.INSTANCE.getText(c)
val e = sc.parallelize(d.split("\n"))
val recipeName = e.take(10).last
val prepTime = e.take(18).last
(recipeName,prepTime)
}
//How transformation and action applied here?
我坚持如何应用进一步的转换和操作,以便根据函数doSomething映射我的所有输入文件,并使用saveAsTextFile将每个输入文件的所有输出存储在一个文件中。
答案 0 :(得分:1)
因此,如果我的理解是正确的,那么你有一个RDD对,你希望对它进行一些转换,然后将每个键的输出保存到一个唯一的文件中。将它转换为相对容易的,mapValue
将允许您仅对值进行转换,以及任何其他转换将对对的RDD起作用。
然而,将输出保存为每个键的唯一文件有点棘手。一种选择是尝试找到一个hadoopoutput格式,它可以做你想要的,然后使用saveAsHadoopFile
,另一种选择是使用foreach
,然后只需编写代码输出每个键/值对期望的。