在Scala Spark中加载HDFS上的任意二进制文件

时间:2018-02-14 15:51:29

标签: scala apache-spark hdfs

情景:

  • HDFS上有1000多个海量二进制文件

  • 有一个def decode(String localFilePath): Array[MyCustomType]可以解码文件给定其记录数组的本地路径

如何使用Scala spark并行加载这些文件并获得RDD[MyCustomType]作为回报?

PS。 decode是一个thrift解码器,它获取本地文件名,将一个thrift文件作为记录数组加载到内存中。

我认为这里缺少的谜题是将文件从HDFS下载到节点并将本地名称传递给decode ..

1 个答案:

答案 0 :(得分:0)

解决方案是您需要使用spark PortableDataStream将HDFS上的二进制数据流式传输到计算节点。

val documentsRDD: RDD[Document] = sparkContext.binaryFiles("/data/path/on/hdfs")
  .flatMap { case (f: String, p: PortableDataStream) => {
    val stream: BufferedInputStream = new BufferedInputStream(new GZIPInputStream(dis), 2048)
    // you can take it from here and do the rest. in my case I was dealing with thrift:
    val protocol: TBinaryProtocol = new TBinaryProtocol(new TIOStreamTransport(stream))
  } 
}