我的目标是将一些文件合并在一起。我获取这些文件,处理它们然后将它们作为数组[Byte]返回。然后将其并行化。
我更改了变量名称,使阅读更容易。
val files= sc.parallelize(listOfFilesToProcess)
.map(m => processFilesAndReturnByteArray(fileLocation, fileName,))
然后我接受files
并迭代每个分区,尝试将文件合并在一起并创建更少的大文件。我最初尝试使用字符串,并且我有一个Iterator[Option[String]]
这很好 - 我有一个非常简单的循环,运行良好,但非常有用:
files.foreachPartition(iter => {
val txt = iter.mkstring
saveFile(outputLocation, outputPath, txt.bytes)
})
为了提高效率,我现在使用Array [Bytes]意味着我的Iterator是Iterator[Option[Array[Byte]]]
- 我对Spark和Scala来说很新,所以造成愚蠢错误的可能性很大高。
使用字节,我无法找到一种方法将它们连接在一起,而无需通过迭代器进程,这意味着我创建的文件与我必须创建的文件一样多,每个文件都有一个,所以此时的应用程序没用了。然后我想使用ListBuffer连接这些字节数组,然后保存它,但这本身就是创建错误的输出,包括0字节文件和重复数据的文件。
如果有人能够偷看并指出我正确的方向,那就太棒了,谢谢!
这是我用于字节的当前版本:
files.foreachPartition(iter => {
val joinedBytes = new ListBuffer[Byte]
while(iter.hasNext) {
val item = iter.next()
item match{
case Some(x) => joinedBytes.++=(x)
case None => Logger.info("Todo: Handle this properly")
}
}
saveFile(outputLocation, outputPath, joinedBytes.toArray)
})