Funke: schreiben DataFrame als komprimierte JSON
Apache Spark DataFrameReader.json()
verarbeiten kann gzipped JSONlines Dateien automatisch, aber es scheint nicht zu einem Weg, um DataFrameWriter.json()
zu schreiben komprimiert JSONlines-Dateien. Die zusätzliche Netzwerk-I/O ist sehr teuer in der cloud.
Gibt es einen Weg um dieses problem herum?
- Haben Sie entdecken einen Weg, der zum komprimieren json-Ausgabe? Ich bin auch auf der Suche nach einer Lösung.
- Ich habe nicht einen Weg fand, das zu tun dieses noch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgende Lösungen verwenden pyspark, aber ich nehme an, den code in Scala wäre ähnlich.
Erste option ist, um die folgenden, wenn Sie initialisieren Ihre SparkConf:
Mit dem code über jede Datei, die Sie produzieren mit, dass sparkContext automatisch mit gzip komprimiert.
Zweite option, wenn Sie möchten, zu komprimieren ausgewählten Dateien werden nur in Ihrem Kontext. Können sagen, "df" ist ein dataframe und mit dem Namen Ihres Ziels:
def saveAsTextFile(path: String, codec: Class[_ <: CompressionCodec])
so, dass der code der Klasse sollte direkt übergeben und nicht als string._SUCCES
undpart-*
- Datei. Ich brauche nur einen spezifischen Namen eine einzige Datei...conf.set("spark.hadoop.mapred.output.compression.codec", "true")
notwendig istMit Spark 2.X (und vielleicht auch früher, habe ich nicht getestet) es gibt eine einfachere Art und Weise zu schreiben ein komprimiertes JSON, die keine änderung der Konfiguration:
Dies funktioniert auch für CSV und Parkett, verwenden Sie einfach .csv() und .Parkett() statt .json() zu schreiben, die Datei nach der Einstellung der compression-option.
Möglichen codecs: keine, bzip2, deflate, gzip, lz4 und bissig.
Einstellung der compression-Option auf einen
SparkConf
ist NICHT eine gute Praxis, da die akzeptierte Antwort. Es verändert das Verhalten Global statt der Angabe der Einstellungen auf einer pro-Datei-basis. Die Wahrheit ist, explizit ist immer besser als implizit. Es gibt auch einige Fälle, in denen der Benutzer nicht manipulieren kann, die Kontext-Konfiguration einfach, wie Funke-shell oder in codes entwickelt, die als Submodul von anderen.Der richtige Weg
Schreiben
DataFrame
mit Kompression unterstützt seit Spark 1.4. Mehrere Möglichkeiten, um zu erreichen, dass:Eine
Das ist es! Verwenden Sie einfach
DataFrameWriter.json()
wie Sie es wünschen.Ist die Magie versteckt in den code
pyspark/sql/readwriter.py
Unterstützt Kompression Formate bzip2, gzip, lz4, bissig und entlüften, groß-und Kleinschreibung.
Der scala-API sollte das gleiche sein.
Anderen
Ähnlich wie oben. weitere Optionen können suppied als Schlüsselwort-Argumente. seit Spark 1.4.
Dritten
DataFrameWriter.option()
ist, Hinzugefügt, da Spark 1.5. Nur ein parameter Hinzugefügt werden konnte zu einer Zeit.