Spark SQL saveAsTable ist nicht kompatibel mit Hive als partition angegeben ist
Art von edge-Fall, beim speichern von Parkett-Tabelle in Spark SQL mit partition
#schema definitioin
final StructType schema = DataTypes.createStructType(Arrays.asList(
DataTypes.createStructField("time", DataTypes.StringType, true),
DataTypes.createStructField("accountId", DataTypes.StringType, true),
...
DataFrame df = hiveContext.read().schema(schema).json(stringJavaRDD);
df.coalesce(1)
.write()
.mode(SaveMode.Append)
.format("parquet")
.partitionBy("year")
.saveAsTable("tblclick8partitioned");
Funke warnt:
Anhaltende partitioniert data-source-relation in den Hive-metastore in
Spark SQL-spezifischen format, das NICHT kompatibel ist mit Hive
Hive:
hive> describe tblclick8partitioned;
OK
col array<string> from deserializer
Time taken: 0.04 seconds, Fetched: 1 row(s)
Offensichtlich das schema nicht korrekt - aber, wenn ich saveAsTable
Spark SQL ohne partition der Tabelle abgefragt werden können, ohne problem.
Frage ist, wie kann ich einen Parkett-Tabelle in Spark SQL-kompatibel mit Hive mit partition info?
Daten in hdfs-und Metadaten werden in hive-metastore
Hast du versucht auf "registrieren Sie sich als temp-Tabelle" führen Sie dann die SQL-Befehle "TABELLE ERSTELLEN" und dann "EINFÜGEN <mit dynamischer Partitionierung syntax>"?
Danke Samson , noch nicht, ist aber nicht saveAsTable tun, was es wohl auf sich ?
Vielleicht ist es davon abhängig, welche version von Spark, die Sie verwenden, z.B. "seine" not a bug, it 's a feature" vs. "umgesetzt werden someday"
Hast du versucht auf "registrieren Sie sich als temp-Tabelle" führen Sie dann die SQL-Befehle "TABELLE ERSTELLEN" und dann "EINFÜGEN <mit dynamischer Partitionierung syntax>"?
Danke Samson , noch nicht, ist aber nicht saveAsTable tun, was es wohl auf sich ?
Vielleicht ist es davon abhängig, welche version von Spark, die Sie verwenden, z.B. "seine" not a bug, it 's a feature" vs. "umgesetzt werden someday"
InformationsquelleAutor dunlu_98k | 2016-08-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil DataFrame.saveAsTable erstellt RDD Partitionen, aber nicht die Hive-Partitionen, die Problemumgehung ist, um die Tabelle zu erstellen über hql vor dem Aufruf DataFrame.saveAsTable. Ein Beispiel aus SPARK-14927 sieht wie folgt aus:
InformationsquelleAutor rys
Lösung ist zum erstellen der Tabelle mit Hive und dann speichern Sie die Daten mit
...partitionBy("year").insertInto("default.mytable")
.Meiner Erfahrung nach erstellen der Tabelle in Hive und dann mit
...partitionBy("year").saveAsTable("default.mytable")
hat nicht funktioniert. Dies ist mit Spark 1.6.2.User class threw exception: org.apache.spark.sql.AnalysisException: insertInto() can't be used together with partitionBy(). Partition columns have already be defined for the table. It is not necessary to use partitionBy().;
verwenden Sie die Optionen, dann wird es funktionieren.
InformationsquelleAutor foghorn