web-dev-qa-db-fra.com

Comment enregistrer un DataFrame au format CSV compressé (compressé)?

J'utilise Spark 1.6.0 et Scala.

Je souhaite enregistrer un DataFrame au format CSV compressé.

Voici ce que j'ai jusqu'à présent (supposons que j'ai déjà df et sc comme 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)

La sortie n'est pas au format gz.

13
user2628641

Sur le github spark-csv: https://github.com/databricks/spark-csv

On peut lire:

codec: codec de compression à utiliser lors de l'enregistrement dans un fichier. Doit être le nom complet d'une classe implémentant org.Apache.hadoop.io.compress.CompressionCodec ou l'un des noms raccourcis insensibles à la casse (bzip2, gzip, lz4 et snappy). Par défaut, aucune compression n'est effectuée lorsqu'un codec n'est pas spécifié.

Dans votre cas, cela devrait fonctionner: df.write.format("com.databricks.spark.csv").codec("gzip")\ .save('my_directory/my_file.gzip')

7

Ce code fonctionne pour Spark 2.1, où .codec N'est pas disponible.

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

Pour Spark 2.2, vous pouvez utiliser l'option df.write.csv(...,codec="gzip") décrite ici: https://spark.Apache.org/docs/latest/api/python/ pyspark.sql.html? highlight = codec

23
Ravi Kant Saini

Avec Spark 2.0+, cela est devenu un peu plus simple:

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

Vous n'avez plus besoin du package CSV externe de Databricks.

L'écrivain csv() prend en charge un certain nombre d'options pratiques. Par exemple:

  • sep: pour définir le caractère de séparation.
  • quote: Indique si et comment citer des valeurs.
  • header: Indique s'il faut inclure une ligne d'en-tête.

Il existe également un certain nombre d'autres codecs de compression que vous pouvez utiliser, en plus de gzip:

  • bzip2
  • lz4
  • snappy
  • deflate

Les documents complets Spark pour l'écrivain csv() sont ici: Python / Scala

17
Nick Chammas

Pour écrire le fichier CSV avec des en-têtes et renommer le fichier part-000 en .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
}

Si vous n'avez pas besoin de l'en-tête, définissez-le sur false et vous n'aurez pas non plus besoin de faire la fusion. Il sera également plus rapide d'écrire.

2
morfious902002