2016-10-26 4 views
1

Ich benutze Spark 2.0 und ich frage mich, ob es möglich ist, alle Dateien für spezifische Hive-Tabelle aufzulisten? Wenn dies der Fall ist, kann ich diese Dateien inkrementell direkt mit dem Spark sc.textFile("file.orc") aktualisieren. Wie kann ich der Hive-Tabelle eine neue Partition hinzufügen? Gibt es eine Api auf der Bienenstockmetastase, die ich aus Funken benutzen kann?Hive on Spark listet alle Partitionen für spezifische Hive-Tabelle auf und fügt eine Partition hinzu

Gibt es eine Möglichkeit, die interne hive Funktion zu erhalten, die Datenrahmen row => partition_path

meine Haupt Argumentation Karte inkrementelle Updates für eine Tabelle. Im Augenblick ist die einzige Art, wie ich herausgefunden habe, ist FULL OUTER JOIN SQL + SaveMode.Overwrite, die nicht so effizient ist, weil er die ganze Tabelle überschrieben werden, während mein Hauptinteresse inkrementelles Updates für bestimmte Partitionen/Hinzufügen neue Partition

EDIT von was ich auf dem HDFS gesehen habe, wenn SaveMode.Overwrite Funke die Tabellendefinition ausgeben wird, dh CREATE TABLE my_table .... PARTITION BY (month,..). Spark setzt alle Dateien unter $HIVE/my_table und nicht unter $HIVE/my_table/month/..., was bedeutet, dass er die Daten nicht partitioniert. als ich df.write.partitionBy(...).mode(Overwrite).saveAsTable("my_table") schrieb, habe ich auf hdfs gesehen, dass es richtig ist. Ich habe SaveMode.Overwrite verwendet, weil ich Datensätze aktualisiere und Daten nicht anhege.

Ich lade Daten mit spark.table("my_table") was bedeutet, dass Funken faul laden die Tabelle, die ein Problem ist, da ich nicht alle die Tabelle nur Teil von If laden will.

für die Frage:

1.Does Funken gehen, um die Daten zu mischen, weil ich partitionBy() verwendet haben, oder er vergleicht aktuelle Partition und wenn ihr die gleichen er die Daten nicht mischen wird.

2.Funkt Smart intelligent genug, um Partitionsbeschneidung zu verwenden, wenn ein Teil der Daten mutiert wird, d. H. Nur für einen bestimmten Monat/Jahr, und diese Änderung anwenden, anstatt alle Daten zu laden? (FULL OUTER JOIN ist grundsätzlich Operation, die alle in der Tabelle Scan)

Antwort

4

Hinzufügen von Partitionen:

Hinzufügen Partition von Funken mit partitionBy in DataFrameWriter für nicht gestreamt oder mit DataStreamWriter für gestreamte Daten vorgesehen erfolgen.

public DataFrameWriter<T> partitionBy(scala.collection.Seq<String> colNames) 

so, wenn Sie Daten von year und month Funken partitionieren möchten die Daten speichern in Ordner wie:

year=2016/month=01/ 
year=2016/month=02/ 

Sie orc erwähnt haben - Sie Einsparung als orc Format mit verwenden können:

df.write.partitionBy('year', 'month').format("orc").save(path) 

aber Sie können leicht in Hive-Tabelle einfügen wie:

df.write.partitionBy('year', 'month').insertInto(String tableName) 

bekommen alle Partitionen:

Spark-SQL auf hive Abfragesprache basiert, so dass Sie SHOW PARTITIONS verwenden Liste der Partitionen in der speziellen Tabelle zu erhalten.

sparkSession.sql("SHOW PARTITIONS partitionedHiveTable") 

So stellen Sie sicher, dass Sie .enableHiveSupport() haben, wenn Sie Sitzung mit SparkSessionBuilder zu schaffen und auch sicherstellen, ob Sie hive-conf.xml etc. richtig

+0

vorausgesetzt konfiguriert haben nenne ich 'partitionBy()' zweimal für das gleiche Schema. Ist Spark intelligent genug, um zu erkennen, dass er diese Operation vermeiden kann, vorausgesetzt, ich hätte Daten wie Sie erwähnt und ich möchte "Jahr = 2017/Monat = 01" zu meinem Datenrahmen hinzufügen, ist Funken intelligent genug, um zu erkennen, dass er es nicht tut müssen Daten von 'Jahr2016/Monat = 1' mischen/laden? –

+0

Der Befehl 'show partitions my_table' gibt mir nicht den Speicherort/Pfad für die Dateien im Hadoop-Dateisystem. –

+0

@DavidH Wenn Sie einen Datenrahmen mit 'Jahr 2017' und' Monat01' haben und diese Daten in die Tabelle schreiben, erstellt Spark diese Partition und speichert neue Daten, ohne Daten von 'Jahr2016/Monat = 1' zu laden. Ich bekomme deinen zweiten Kommentar nicht. wenn Sie ['show partitions my_table'] aufrufen (https://docs.cloud.databricks.com/docs/latest/databricks_guide/04%20SQL,%20DataFrames%20%26%20Datasets/11%20SparkSQL%20Language%20Manual/ Show% 20Partitions.html) und Sie habenhivesupport aktiviert, spark sqlshould Liste anzeigen zB: 'yearX/monthY' für partitionierte' my_table' – VladoDemcak

Verwandte Themen