使用Spark foreachPartition和ListBuffer连接Array [Bytes]

时间:2016-08-11 08:48:57

标签: java arrays scala apache-spark

我的目标是将一些文件合并在一起。我获取这些文件,处理它们然后将它们作为数组[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)
        })

0 个答案:

没有答案