2015-04-28 6 views
9

Im Versuch, einen Funken Datenrahmen zu speichern (von mehr als 20 g) zu einer einzigen JSON-Datei in Amazon S3, mein Code, um den Datenrahmen zu speichern ist wie folgt:speichert großen Funkendatenrahmen als eine einzelne JSON-Datei in S3

dataframe.repartition(1).save("s3n://mybucket/testfile","json") 

Aber ich bekomme einen Fehler von S3 "Ihr vorgeschlagener Upload überschreitet die maximal zulässige Größe", ich weiß, dass die maximale Dateigröße von Amazon 5 GB ist.

Ist es möglich, S3-Multipart-Upload mit Spark zu verwenden? oder gibt es einen anderen Weg, dies zu lösen?

Btw ich brauche die Daten in einer einzigen Datei, weil ein anderer Benutzer es nach herunterladen wird.

* Ich benutze Apache Funke 1.3.1 in einem 3-Knoten-Cluster mit dem Spark-ec2-Skript erstellt.

Vielen Dank

JG

+0

ich, dass gerade gesehen, wenn ich s3a statt S3N verwenden es mein Problem lösen könnte (http://wiki.apache.org/hadoop/AmazonS3), aber die Sache ist, dass die Hadoop-Version, die ich benutze (Hadoop 2.0.0-cdh4.2.0) es s3a nicht unterstützt. Irgendwelche Ideen? Danke noch einmal. – jegordon

Antwort

18

Ich würde versuchen, die großen Datenrahmen in eine Reihe von kleineren Datenrahmen zu trennen, die Sie dann in die gleiche Datei im Ziel anhängen.

df.write.mode('append').json(yourtargetpath) 
+8

@TheRandomSuite: Wissen Sie vielleicht, ob es möglich ist, das hadoopish-Format zu vermeiden und Daten in einer Datei unter einem s3-Schlüsselnamen meiner Wahl anstatt des Verzeichnisses mit '_SUCCES' und' part- * 'zu speichern? – lisak

+1

Das funktionierte auch für mich !! Danke @Jared !! –

-2

s3a nicht Serienversion in Spark ist, denke ich. Ich würde sagen, das Design ist nicht gesund. repartition (1) wird fürchterlich sein (was du sagst, funke ist, alle Partitionen zu einem einzigen zusammenzuführen). Ich würde vorschlagen, den Downstream zu überzeugen, Inhalte aus einem Ordner anstelle einer einzigen Datei

2

Versuchen Sie, diese

dataframe.write.format("org.apache.spark.sql.json").mode(SaveMode.Append).save("hdfs://localhost:9000/sampletext.txt"); 
Verwandte Themen