解压缩多个* .gz文件,并在spark scala中制作一个csv文件

时间:2018-09-26 15:34:24

标签: scala apache-spark apache-spark-sql databricks

我在S3存储桶中有多个文件,必须解压缩这些文件并将所有文件合并为具有单个标头的单个文件(CSV)。所有文件都包含相同的标头。

数据文件如下所示。

存储系统:S3存储桶。

 part-0000-XXXX.csv.gz
 part_0001-YYYY.csv.gz
 part-0002-ZZZZ.csv.gz
 .
 .
 .
 .
 part-0010_KKKK.csv.gz.

我想要所有文件中的一个CSV文件,如上所示。请帮助我解压缩和合并所有文件。

将所有文件解压缩并合并到一个CSV文件中之后,我可以使用该文件与以前的文件进行数据比较。

我正在使用Spark 2.3.0和Scala 2.11

非常感谢。

2 个答案:

答案 0 :(得分:1)

下面提到的代码似乎工作正常。

scala> val rdd = sc.textFile("/root/data")
rdd: org.apache.spark.rdd.RDD[String] = /root/data MapPartitionsRDD[1] at textFile at <console>:24


scala> rdd.coalesce(1).saveAsTextFile("/root/combinedCsv", classOf[org.apache.hadoop.io.compress.GzipCodec])

您可以看到输入数据位于/root/data目录中,并且以gzip格式组合的csv存储在/root/combinedCsv目录中。

更新

如果要以csv格式存储数据,请剥离GzipCodec部分。

scala> rdd.coalesce(1).saveAsTextFile("/root/combinedCsv")

答案 1 :(得分:0)

您可以使用以下代码,也可以直接从gz文件读取而不提取:

val filePath = "/home/harneet/<Dir where all gz/csv files are present>"

var cdnImpSchema = StructType(Array(
 StructField("idate",     TimestampType, true),
 StructField("time",     StringType, true),
 StructField("anyOtherColumn",  StringType, true)
))

var cdnImpDF = spark.read.format("csv").     // Use "csv" regardless of TSV or CSV.
 option("delimiter", ","). // Set delimiter to tab or comma or whatever you want.
 schema(cdnImpSchema).        // Schema that was built above.
 load(filePath)

cdnImpDF.repartition(1).write.format("com.databricks.spark.csv").option("header", "true").save("mydata.csv")

repartition(1)->将产生一个文件作为输出。