Mit Spark-1.6 ...
Die HiveContext diesen Prozess erheblich vereinfachen kann. Der Schlüssel ist, dass Sie zuerst die Tabelle in Hive erstellen müssen, indem Sie eine CREATE EXTERNAL TABLE
Anweisung mit Partitionierung definieren. Zum Beispiel:
# Hive SQL
CREATE EXTERNAL TABLE test
(name STRING)
PARTITIONED BY
(age INT)
STORED AS PARQUET
LOCATION 'hdfs:///tmp/tables/test'
Von hier aus lassen Sie uns sagen, dass Sie einen Datenrahmen mit neuen Datensätzen in es für eine bestimmte Partition (oder mehrere Partitionen). Sie können eine HiveContext SQL-Anweisung verwenden, um ein INSERT OVERWRITE
mit diesem Datenrahmen durchzuführen, die in die Tabelle nur überschrieben werden für die Partitionen im Datenrahmen enthalten ist:
# PySpark
hiveContext = HiveContext(sc)
update_dataframe.registerTempTable('update_dataframe')
hiveContext.sql("""INSERT OVERWRITE TABLE test PARTITION (age)
SELECT name, age
FROM update_dataframe""")
Hinweis: update_dataframe
in diesem Beispiel hat ein Schema, das die, dass die Spiele Ziel test
Tabelle.
Ein einfacher Fehler bei diesem Ansatz besteht darin, den Schritt CREATE EXTERNAL TABLE
in Hive zu überspringen und die Tabelle einfach mit den Schreibmethoden der Dataframe-API zu erstellen. Insbesondere bei Parquet-basierten Tabellen wird die Tabelle nicht korrekt definiert, um Hives INSERT OVERWRITE... PARTITION
-Funktion zu unterstützen.
Hoffe, das hilft.
Dank viel Sim für die Beantwortung . Nur ein paar Zweifel mehr, wenn der anfängliche Datenrahmen Daten für ungefähr 100 Partitionen hat, dann muss ich diesen Datenrahmen in weitere 100 Datenrahmen mit dem entsprechenden Partitionswert teilen und direkt in das Partitionsverzeichnis einfügen. Kann das Speichern dieser 100 Partitionen parallel erfolgen? Ich benutze auch Spark 1.6.1 Wenn ich das orc-Dateiformat verwende, wie kann ich aufhören, Metadaten-Dateien dafür auszugeben, ist es dasselbe, was du für Parkett erwähnt hast? – yatin
Re: Metadaten, nein, ORC ist ein anderes Format und ich glaube nicht, dass es Nicht-Datendateien erzeugt. Mit 1.6.1 benötigen Sie nur ORC-Dateien in den Unterverzeichnissen der Partitionsstruktur. Sie müssen daher '_SUCCESS' von Hand löschen. Sie können parallel zu mehr als einer Partition schreiben, aber nicht von demselben Job. Starten Sie mehrere Jobs basierend auf Ihren Plattformfunktionen, z. B. mithilfe der REST-API. – Sim
Irgendwelche Updates darüber? Setzt saveToTable() nur bestimmte Partitionen überschreiben? Ist Spark intelligent genug, um herauszufinden, welche Partitionen überschrieben wurden? –