Spark / Scala打开压缩的CSV文件

时间:2014-02-18 22:06:30

标签: scala apache-spark

我是Spark和Scala的新手。我们将广告事件日志文件格式化为CSV,然后使用pkzip进行压缩。我已经看到很多关于如何使用Java解压缩压缩文件的例子,但是我如何使用Scala for Spark做到这一点?我们最终希望从每个传入文件中获取,提取和加载数据到Hbase目标表中。也许这可以通过HadoopRDD来完成?在此之后,我们将介绍Spark流媒体以观察这些文件。

谢谢, 本

2 个答案:

答案 0 :(得分:4)

在Spark中,如果您的文件具有正确的文件名后缀(例如gzip的.gz),并且org.apache.hadoop.io.compress.CompressionCodecFactory支持它,那么您可以使用

sc.textFile(path)

更新:在撰写本文时,他们是Hadoop bzip2库中的一个错误,这意味着尝试使用火花结果读取bzip2文件的奇怪例外 - 通常是ArrayIndexOutOfBounds。

答案 1 :(得分:0)

默认压缩支持

@samthebest答案是正确的,如果您使用的是Spark(Hadoop)中默认使用的压缩格式。这是:

  • 的bzip2
  • gzip的
  • LZ4
  • 活泼

我在其他答案中更深入地解释了这个主题:https://stackoverflow.com/a/45958182/1549135

阅读zip

但是,如果您尝试阅读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)
          }