如何将Dataframe保存为压缩(gzip)csv?

mf98qq94  于 2021-05-27  发布在  Spark
关注(0)|答案(4)|浏览(737)

我使用spark 1.6.0和scala。
我想将Dataframe保存为压缩csv格式。
这是我到目前为止所拥有的(假设我已经拥有了) df 以及 sc 作为 SparkContext ):

//set the conf to the codec I want
sc.getConf.set("spark.hadoop.mapred.output.compress", "true")
sc.getConf.set("spark.hadoop.mapred.output.compression.codec", "true")
sc.getConf.set("spark.hadoop.mapred.output.compression.codec", "org.apache.hadoop.io.compress.GzipCodec")
sc.getConf.set("spark.hadoop.mapred.output.compression.type", "BLOCK")

df.write
  .format("com.databricks.spark.csv")
  .save(my_directory)

输出不在 gz 格式。

0s0u357o

0s0u357o1#

写入带有标题的csv文件并将part-000文件重命名为.csv.gzip

DF.coalesce(1).write.format("com.databricks.spark.csv").mode("overwrite")
.option("header","true")
.option("codec",org.apache.hadoop.io.compress.GzipCodec").save(tempLocationFileName)

copyRename(tempLocationFileName, finalLocationFileName)

def copyRename(srcPath: String, dstPath: String): Unit =  {
  val hadoopConfig = new Configuration()
  val hdfs = FileSystem.get(hadoopConfig)
  FileUtil.copyMerge(hdfs, new Path(srcPath), hdfs, new Path(dstPath), true, hadoopConfig, null)
  // the "true" setting deletes the source files once they are merged into the new output
}

如果不需要头文件,那么将其设置为false,也不需要进行合并。写起来也会更快。

rhfm7lfc

rhfm7lfc2#

此代码适用于spark 2.1,其中 .codec 不可用。

df.write
  .format("com.databricks.spark.csv")
  .option("codec", "org.apache.hadoop.io.compress.GzipCodec")
  .save(my_directory)

对于spark 2.2,可以使用 df.write.csv(...,codec="gzip") 此处描述的选项:https://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=codec

gpnt7bae

gpnt7bae3#

使用spark 2.0+,这变得简单了一些:

df.write.csv("path", compression="gzip")

您不再需要外部databricks csv包了。
这个 csv() writer支持许多方便的选项。例如: sep :设置分隔符。 quote :是否以及如何引用值。 header :是否包含标题行。
除此之外,您还可以使用其他一些压缩编解码器 gzip :
bzip2 lz4 snappy deflate 全速前进 csv() 作者:python/scala

olqngx59

olqngx594#

Spark2.2+ df.write.option("compression","gzip").csv("path") Spark2.0 df.write.csv("path", compression="gzip") Spark1.6
在spark Hub上:https://github.com/databricks/spark-csv
人们可以阅读: codec :保存到文件时要使用的压缩编解码器。应该是实现org.apache.hadoop.io.compress.compressioncodec的类的完全限定名或不区分大小写的shorten名称之一(bzip2、gzip、lz4和snappy)。未指定编解码器时,默认为无压缩。
在这种情况下,这是可行的: df.write.format("com.databricks.spark.csv").codec("gzip")\ .save('my_directory/my_file.gzip')

相关问题