Spark SQL如何读取压缩的csv文件?

时间:2017-06-28 15:43:20

标签: csv apache-spark apache-spark-sql

我已尝试使用api spark.read.csv来读取扩展名为bzgzip的压缩csv文件。有效。但在源代码中,我找不到任何可以声明codec类型的选项参数。

即使在此link中,也只有codec的写作方设置。任何人都可以告诉我或给出源代码的路径,显示spark 2.x版本如何处理压缩的csv文件。

2 个答案:

答案 0 :(得分:3)

您无需对gz压缩csvtsv文件执行任何特殊操作即可获取spark 2.x版本。使用spark 2.0.2

尝试使用以下代码
val options= Map("sep" -> ",")
val csvRDD = spark.read.options(options).csv("file.csv.gz")

我已经为制表符分隔的gz文件做了类似的工作

val options= Map("sep" -> "\t")
val csvRDD = spark.read.options(options).csv("file.tsv.gz")

此外,您可以指定文件夹以读取多个.gz文件并结合解压缩文件

 val csvRDD = spark.read.options(options).csv("/users/mithun/tsvfilelocation/")

答案 1 :(得分:2)

所有与文本相关的数据源,包括CSVDataSource,都使用Hadoop File API来处理文件(它也在Spark Core的RDD中)。

您可以在readFile中找到导致HadoopFileLinesReader的相关行,其中包含以下行:

val fileSplit = new FileSplit(
  new Path(new URI(file.filePath)),
  file.start,
  file.length,
  // TODO: Implement Locality
  Array.empty)

使用Hadoop的org.apache.hadoop.fs.Path来处理基础文件的压缩。

快速谷歌搜索后,我能够找到处理mapreduce.output.fileoutputformat.compress压缩的Hadoop属性。

这导致我使用以下压缩配置的Spark SQL CompressionCodecs

"none" -> null,
"uncompressed" -> null,
"bzip2" -> classOf[BZip2Codec].getName,
"deflate" -> classOf[DeflateCodec].getName,
"gzip" -> classOf[GzipCodec].getName,
"lz4" -> classOf[Lz4Codec].getName,
"snappy" -> classOf[SnappyCodec].getName)

在代码中,您可以找到使用“我们的”选项的setCodecConfiguration

  def setCodecConfiguration(conf: Configuration, codec: String): Unit = {
    if (codec != null) {
      conf.set("mapreduce.output.fileoutputformat.compress", "true")
      conf.set("mapreduce.output.fileoutputformat.compress.type", CompressionType.BLOCK.toString)
      conf.set("mapreduce.output.fileoutputformat.compress.codec", codec)
      conf.set("mapreduce.map.output.compress", "true")
      conf.set("mapreduce.map.output.compress.codec", codec)
    } else {
      // This infers the option `compression` is set to `uncompressed` or `none`.
      conf.set("mapreduce.output.fileoutputformat.compress", "false")
      conf.set("mapreduce.map.output.compress", "false")
    }
  }

另一种方法getCodecClassName用于解析JSONCSVtext格式的compression选项。