我使用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
格式。
答案 0 :(得分:20)
此代码适用于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
答案 1 :(得分:13)
使用Spark 2.0+,这变得更简单了:
df.write.csv("path", compression="gzip")
您不再需要外部Databricks CSV软件包了。
csv()
作者支持许多方便的选项。例如:
sep
:设置分隔符。quote
:是否以及如何引用值。header
:是否包含标题行。除了gzip
之外,您还可以使用许多其他压缩编解码器:
bzip2
lz4
snappy
deflate
答案 2 :(得分:7)
在spark-csv github上: https://github.com/databricks/spark-csv
人们可以读到:
codec
:保存到文件时使用的压缩编解码器。应该是实现org.apache.hadoop.io.compress.CompressionCodec的类的完全限定名称,或者是一个不区分大小写的缩短名称(bzip2,gzip,lz4和snappy)。如果未指定编解码器,则默认为无压缩。
在你的情况下,这应该工作:
df.write.format("com.databricks.spark.csv").codec("gzip")\
.save('my_directory/my_file.gzip')
答案 3 :(得分:2)
使用标题编写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,您也不需要进行合并。写作也会更快。