2016-07-28 21 views
4

Ich versuche, eine Spark-RDD aus mehreren JSON-Dateien zu erstellen, die zu einem tar komprimiert sind. Zum Beispiel, ich habe 3 DateienEinlesen mehrerer komprimierter Dateien im tar.gz-Archiv nach Spark

file1.json 
file2.json 
file3.json 

Und diese sind in archive.tar.gz enthalten.

Ich möchte einen Datenrahmen aus den JSON-Dateien erstellen. Das Problem ist, dass Spark die JSON-Dateien nicht korrekt liest. Das Erstellen einer RDD mit sqlContext.read.json("archive.tar.gz") oder sc.textFile("archive.tar.gz") führt zu einer verzerrten/zusätzlichen Ausgabe.

Gibt es eine Möglichkeit, Gzip-Archive mit mehreren Dateien in Spark zu behandeln?

UPDATE

Mit Hilfe der in der Antwort-Methode Read whole text files from a compression in Spark konnte ich die Dinge zum Laufen bringen, aber diese Methode scheint nicht für große tar.gz-Archive geeignet zu sein (> 200 mb komprimiert) als Die Anwendung scheitert an großen Archivgrößen. Da einige der Archive, mit denen ich es zu tun habe, Größen bis zu 2 GB nach der Komprimierung erreichen, frage ich mich, ob es einen effizienten Weg gibt, mit dem Problem umzugehen.

Ich versuche zu vermeiden, die Archive zu extrahieren und dann die Dateien zusammenzuführen, da dies zeitaufwändig wäre.

+0

Ich habe das gleiche Problem mit großen Dateien, haben Sie eine Lösung gefunden (anders als manuell entpacken und dann zu funken)? :) – ixaxaar

+0

@ixaxaar, ich habe alle Tar-Archive in Hadoop-Sequenzdateien konvertiert, mit denen Spark gut funktioniert. https://stuartsierra.com/2008/04/24/a-million-little-files – septra

+0

vielen Dank für das Glas! Ich habe tatsächlich 50 Tar-Dateien, jede mit einer Million kleinen (JSON) Dateien: D – ixaxaar

Antwort

6

Eine Lösung wird in Read whole text files from a compression in Spark gegeben. das Codebeispiel verwendet zur Verfügung gestellt, ich war in der Lage, wie so einen Datenrahmen aus dem komprimierten Archiv zu erstellen: für tar-Archive von einer relativ kleinen Größe,

Diese Methode funktioniert gut, aber ist für große Archivgrößen nicht geeignet.

Eine bessere Lösung für das Problem scheint die tar-Archive zu konvertieren SequenceFiles Hadoop, die teilbaren sind und somit gelesen und parallel Funken verarbeitet werden kann

See (im Gegensatz zu TAR-Archiven gegenüber.): stuartsierra.com/2008/04/24/a-million-little-files

-1

Dateien innerhalb einer * .tar.gz Datei, wie Sie bereits erwähnt haben, sind komprimiert. Sie können die 3 Dateien nicht in eine einzige komprimierte TAR-Datei schreiben und erwarten von der Importfunktion (die nur nach Text sucht), wie Sie die Dateien dekomprimieren, aus dem tar-Archiv entpacken und dann jede Datei einzeln importieren.

Ich würde empfehlen, dass Sie sich die Zeit nehmen, jede einzelne JSON-Datei manuell hochzuladen, da die beiden Funktionen sc.textfile und sqlcontext.read.json keine komprimierten Daten verarbeiten können.