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