如何使用scala从spark中获取RDD中的值

时间:2015-12-08 07:18:29

标签: scala apache-spark bigdata rdd

我想阅读存储在特定位置的zipfile的内容。 所以我使用了SparkContext.readFile方法,如下所示:

val zipFileRDD = sc.binaryFiles("./handsOn/repo~apache~storm~14135470~false~Java~master~2210.zip")

zipFileRDD: org.apache.spark.rdd.RDD[(String, org.apache.spark.input.PortableDataStream)] = ./handsOn/repo~apache~storm~14135470~false~Java~master~2210.zip BinaryFileRDD[4] at binaryFiles at <console>:21

我的任务是:

如何从此RDD获取PortableDataStream个实例。

2 个答案:

答案 0 :(得分:2)

您可以使用collect actionzipFileRDD.collect将返回Array[(String, PortableDataStream)]。但这通常不是你真正想要的!如果您随后使用这些实例读取文件,那么您实际上并没有使用Spark的功能:一切都发生在您的驱动程序中。相反,应用map和其他转换,以便在不同的工作人员上读取不同的文件。

答案 1 :(得分:0)

如果您只想在RDD之外使用PortableDataStream,那么只需运行:

val zipFilePds = zipFileRDD.map(x => x._2).collect()

使用Apache Commons Compress库,您可以执行以下操作来获取zip文件的内容(在本例中为文件列表):

import org.apache.commons.compress.archivers.zip

val zipFileListing = zipFileRDD.map(x => x._2.open()).map(x => { val y = new ZipArchiveInputStream(x) ; y.getNextEntry().getName() }).collect()