2016-07-30 27 views
3

Ich habe ein Verzeichnis mit ORC-Dateien. Ich schaffe einen Datenrahmen den Code unten mitSpark SQL auf ORC-Dateien gibt nicht korrekt Schema (Spaltennamen)

var data = sqlContext.sql("SELECT * FROM orc.`/directory/containing/orc/files`"); 

Es Datenrahmen mit diesem Schema gibt

[_col0: int, _col1: bigint] 

Wo, wie das erwartete Schema ist

[scan_nbr: int, visit_nbr: bigint] 

Wenn ich auf Dateien im Parkett abfragen Format Ich bekomme das richtige Schema.

Fehle ich irgendwelche Konfiguration (en)?

mehr Hinzufügen Details

Dies ist Hortonworks Verteilung HDP 2.4.2 (Funken 1.6.1, Hadoop 2.7.1, Hive 1.2.1)

Wir nicht die Standardkonfigurationen von geändert haben HDP, aber das ist definitiv nicht das Gleiche wie die Plain-Vanilla-Version von Hadoop.

Daten werden von Upstream-Hive-Jobs geschrieben, ein einfaches CTAS (CREATE TABLE-Beispiel gespeichert als ORC als SELECT ...).

Ich testete dies auf eingereicht von CTAS generiert mit dem neuesten 2.0.0 Bienenstock & es behält die Spaltennamen in den ORC-Dateien.

+0

Funktioniert gut für mich. Kannst du etwas Detail hinzufügen? Konfiguration, Versionen, wie Sie Daten gespeichert haben ... – zero323

+0

Hinzugefügt Weitere Details –

+0

Meine 2 Cent: Überprüfen Sie, dass * alle * Dateien das exakt gleiche Schema haben; Da Hive die "theoretischen" Spaltennamen in seinem MetaStore speichert, ignoriert es möglicherweise Diskrepanzen. Da Sie aber Spark benötigen, um die Dateien direkt zu öffnen, können diese Dateien, wenn sie unterschiedliche Spaltennamen haben, auf Spaltennummern zurückgreifen. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC#LanguageManualORC-ORCFileDumpUtility –

Antwort

4

Das Problem ist die Hive-Version, die 1.2.1 ist, die diesen Fehler hat HIVE-4243

Das in 2.0.0 behoben.

0

Wenn Sie die Parkett-Version als auch haben, können Sie nur die Spaltennamen kopieren Sie, das ist, was ich getan habe (auch war die Datumsspalte Partitionsschlüssel für Ork so hatte es bis zum Ende zu bewegen):

-2

Wenn die Versionsaktualisierung keine verfügbare Option ist, könnte eine schnelle Korrektur darin bestehen, die ORC-Datei mit PIG neu zu schreiben. Das scheint gut zu funktionieren.

+0

Ich sehe nicht, wie das die Frage beantwortet. – GhostCat

0

Wir verwenden:

val df = hiveContext.read.table("tableName")

Ihre df.schema oder df.columns werden tatsächlichen Spaltennamen geben.