2017-05-21 2 views
0

Wenn ich Datenrahmen speichere diese Art und Weise in Java, ...:Wie Parkett Dateien aus hadoopish Ordnern laden

df.write().parquet("myTest.parquet"); 

..., dann wird es in einer hadoopish Weise (ein Ordner mit zahlreichen Dateien gespeichert).

Kann der Datenrahmen als einzelne Datei gespeichert werden? Ich habe versucht collect(), aber es hilft nicht.

Wenn es unmöglich ist, dann ist meine Frage, wie soll ich die Python-Code-Dateien zum Lesen Parkett aus hadoopish Ordnern df.write().parquet("myTest.parquet") erstellt ändern:

load_df = sqlContext.read.parquet("myTest.parquet").where('field1="aaa"').select('field2', 'field3').coalesce(64) 

Antwort

1

Funke schreibt Ihre Dateien in einem Verzeichnis, diese Dateien in zahlreichen, wie Sie sagen, und wenn der Schreibvorgang erfolgreich speichert es eine weitere leere Datei namens _SUCCESS

Ich bin von scala kommen, aber ich glaube, dass es ein ähnliches ist Art und Weise in python

speichern und lesen Sie Ihre Dateien in parquet oder json oder was auch immer Sie das gewünschte Format ist einfach:

df.write.parquet("path") 
loaddf = spark.read.parquet("path") 

Ich habe versucht, sammeln(), aber es hilft nicht.

über collect Reden, es ist keine gute Praxis ist es bei solchen Operationen zu verwenden, da sie Ihre Daten-Treiber gibt, so dass Sie die parallele Berechnung Vorteile verlieren, und es wird eine OutOfMemoryException, wenn die Daten verursachen kann nicht in den Speicher passen

Ist es möglich, Datenrahmen als einzelne Datei zu speichern?

Sie brauchen nicht wirklich in wichtigen Fällen, wenn dies der Fall, verwenden Sie die repartition(1) Methode auf Ihrem Dataframe vor dem Speichern sie

Hoffe, es hilft, Mit freundlichen Grüßen zu tun, dass

1

Ist es möglich, Datenrahmen als eine einzelne Datei zu speichern ?

Ja, aber Sie sollten nicht, wie Sie auf einer einzigen JVM setzen zu viel Druck kann, die nicht nur zu Leistungseinbußen, sondern auch auf JVM-Terminierung und damit die gesamte Funken Anwendung Versagen führen kann.

Also, ja, dann ist es möglich, und Sie sollten repartition(1) eine einzelne Partition haben:

repartition (numPartitions: Int): Datensatz [T] einen neuen Datensatz zurück, der genau numPartitions Partitionen hat.


wie soll ich das Python-Code aus hadoopish Ordner zum Lesen Parkett Dateien ändern

Laden des Datensatzes aus, wie Sie es als ein „hadoopish“ Ordner ist nicht besorgt zu sein die interne Struktur überhaupt, und betrachten es als eine einzige Datei (das ist ein Verzeichnis unter den Abdeckungen).

Das ist eine interne Darstellung wie die Dateien gespeichert werden und hat keinen Einfluss auf den Code, um es zu laden.

Verwandte Themen