speichern Funke dataframe zu Hive: Tabelle nicht lesbar, da "Parkett nicht SequenceFile"
Ich würde gerne zum speichern von Daten in einer Spark (v 1.3.0) dataframe, um eine Hive-Tabelle mit PySpark.
Den Dokumentation Staaten:
"der Funke.sql.hive.convertMetastoreParquet: Wenn auf false gesetzt, Spark SQL verwenden Sie die Hive-SerDe für Parkett-Tabellen anstelle der eingebauten Unterstützung."
Blick auf die Spark tutorial, scheint es, dass diese Eigenschaft kann eingestellt werden:
from pyspark.sql import HiveContext
sqlContext = HiveContext(sc)
sqlContext.sql("SET spark.sql.hive.convertMetastoreParquet=false")
# code to create dataframe
my_dataframe.saveAsTable("my_dataframe")
Jedoch, wenn ich versuche, die Abfrage der gespeicherten Tabelle in Hive gibt es:
hive> select * from my_dataframe;
OK
Failed with exception java.io.IOException:java.io.IOException:
hdfs://hadoop01.woolford.io:8020/user/hive/warehouse/my_dataframe/part-r-00001.parquet
not a SequenceFile
Wie Speichere ich die Tabelle so, dass es sofort lesbar auf Hive?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hab ich schon da...
Die API ist ein bisschen irreführend auf diese ein.
DataFrame.saveAsTable
hat nicht erstellen einer Hive-Tabelle, sondern eine interne Spark-Tabelle source.Es speichert auch etwas in den Hive-metastore, aber nicht das, was Sie wollen.
Diese Bemerkung wurde von spark-Anwender-mailing-Liste in Bezug auf Funke-1.3.
Wenn Sie möchten, erstellen Sie eine Hive-Tabelle, aus Funken, können Sie diesen Ansatz verwenden:
1. Verwenden
Create Table ...
über SparkSQL für Hive-metastore.2. Verwenden
DataFrame.insertInto(tableName, overwriteMode)
für die eigentlichen Daten (Funke 1.3)Ich dieses Problem Letzte Woche und war in der Lage einen workaround finden
Hier ist die Geschichte:
Ich kann sehen, dass die Tabelle in Hive-wenn ich die Tabelle erstellt ohne partitionBy:
Aber Hive nicht verstehen kann, ist die Tabelle, schema(schema leer ist...), wenn ich dies tun:
[Lösung]:
Das problem ist, dass die datasource-Tabelle erstellt, durch Dataframe API(partitionBy+saveAsTable) ist nicht kompatibel mit Bienenkorb.(siehe diese link). Durch die Einstellung Funken.sql.hive.convertMetastoreParquet false wie vorgeschlagen, in der doc, Spark stellt nur Daten auf HDFS,aber nicht Tabelle anlegen auf Hive. Und dann können Sie es manuell gehen in die hive-shell erstellen Sie eine externe Tabelle mit der richtigen schema&partition definition verweist auf den Ablageort der Daten.
Getestet hab ich das in der Funke 1.6.1 und es funktionierte für mich. Ich hoffe, das hilft!
.partitionBy("ts")
Habe ich getan in pyspark, spark version 2.3.0 :
erstellen Sie eine leere Tabelle, wo wir brauchen, um zu speichern/überschreiben der Daten wie:
führen Sie dann die unten Befehl:
Das Problem ist das Sie nicht Lesen können, diese Tabelle mit den hive-aber Lesen Sie mit spark.
Metadaten nicht bereits vorhanden ist. In anderen Worten, es werden alle Partitionen, die es gibt auf HDFS aber nicht im metastore, den hive-metastore.