web-dev-qa-db-ja.com

DataFrameを圧縮(gzip圧縮)CSVとして保存する方法は?

Spark 1.6.0およびScalaを使用します。

DataFrameを圧縮CSV形式で保存したい。

ここに私がこれまでに持っているものがあります(すでにdfscSparkContextとしてあると仮定します):

//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形式ではありません。

13
user2628641

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')

7

このコードは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

23
Ravi Kant Saini

Spark 2.0+では、これは少し単純になりました。

_df.write.csv("path", compression="gzip")
_

外部Databricks CSVパッケージはもう必要ありません。

csv()ライターは、多くの便利なオプションをサポートしています。例えば:

  • sep:区切り文字を設定します。
  • quote:値を引用するかどうか、どのように引用するか。
  • header:ヘッダー行を含めるかどうか。

gzipに加えて、使用できる他の圧縮コーデックも多数あります。

  • _bzip2_
  • _lz4_
  • snappy
  • deflate

完全なSpark csv()ライターのドキュメントはこちら: Python / Scala

17
Nick Chammas

ヘッダー付きの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に設定し、合体する必要もありません。書くのも速くなります。

2
morfious902002