我是Spark和Scala的新手。我们将广告事件日志文件格式化为CSV,然后使用pkzip进行压缩。我已经看到很多关于如何使用Java解压缩压缩文件的例子,但是我如何使用Scala for Spark做到这一点?我们最终希望从每个传入文件中获取,提取和加载数据到Hbase目标表中。也许这可以通过HadoopRDD来完成?在此之后,我们将介绍Spark流媒体以观察这些文件。
谢谢, 本
答案 0 :(得分:4)
在Spark中,如果您的文件具有正确的文件名后缀(例如gzip的.gz),并且org.apache.hadoop.io.compress.CompressionCodecFactory
支持它,那么您可以使用
sc.textFile(path)
更新:在撰写本文时,他们是Hadoop bzip2库中的一个错误,这意味着尝试使用火花结果读取bzip2文件的奇怪例外 - 通常是ArrayIndexOutOfBounds。
答案 1 :(得分:0)
@samthebest答案是正确的,如果您使用的是Spark(Hadoop)中默认使用的压缩格式。这是:
我在其他答案中更深入地解释了这个主题:https://stackoverflow.com/a/45958182/1549135
但是,如果您尝试阅读zip
文件,则需要创建自定义解决方案。在我已经提供的答案中提到了一个。
如果您需要从档案中读取多个文件,您可能会对我提供的答案感兴趣:https://stackoverflow.com/a/45958458/1549135
基本上,始终使用sc.binaryFiles
以及稍后解压缩PortableDataStream
,如示例所示:
sc.binaryFiles(path, minPartitions)
.flatMap { case (name: String, content: PortableDataStream) =>
val zis = new ZipInputStream(content.open)
Stream.continually(zis.getNextEntry)
.takeWhile(_ != null)
.flatMap { _ =>
val br = new BufferedReader(new InputStreamReader(zis))
Stream.continually(br.readLine()).takeWhile(_ != null)
}