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
形式ではありません。
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')
このコードは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
Spark 2.0+では、これは少し単純になりました。
_df.write.csv("path", compression="gzip")
_
外部Databricks CSVパッケージはもう必要ありません。
csv()
ライターは、多くの便利なオプションをサポートしています。例えば:
sep
:区切り文字を設定します。quote
:値を引用するかどうか、どのように引用するか。header
:ヘッダー行を含めるかどうか。gzip
に加えて、使用できる他の圧縮コーデックも多数あります。
bzip2
_lz4
_snappy
deflate
ヘッダー付きの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に設定し、合体する必要もありません。書くのも速くなります。