情景:
HDFS上有1000多个海量二进制文件
有一个def decode(String localFilePath): Array[MyCustomType]
可以解码文件给定其记录数组的本地路径
如何使用Scala spark并行加载这些文件并获得RDD[MyCustomType]
作为回报?
PS。 decode
是一个thrift解码器,它获取本地文件名,将一个thrift文件作为记录数组加载到内存中。
我认为这里缺少的谜题是将文件从HDFS下载到节点并将本地名称传递给decode
..
答案 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))
}
}