2016-07-25 7 views
2

Ich habe einen Funken Job, die Daten von einer externen Hive Tabelle lesen und einige Transformation tun und Daten in einer anderen internen Hive Tabelle erneut speichernSpark-SQL: HiveContext nicht ignorieren Header

val sparkConf = new SparkConf().setAppName("Bulk Merge Daily Load Job") 
val sparkContext = new SparkContext(sparkConf) 
val sqlContext = new HiveContext(sparkContext) 

// Data Ingestion 
val my_df = sqlContext.sql("select * from test") 

// Transformation 
... 
... 

// Save Data into Hive 
my_df.write.format("orc") 
.option("orc.compress","SNAPPY") 
.mode(SaveMode.Overwrite) 
.saveAsTable("my_internal_table") 

Die externe Tabelle ist mit der dieser tblproperties Linie erstellt:

tblproperties ("skip.header.line.count"="1"); 

Mein Problem ist, dass ich in meinen Zeilen in der Tabelle my_internal_table eine zusätzliche Zeile, die die Spalte Namen gefunden.

Ich denke, dies ist im Zusammenhang mit dieser issue:

I Funke 1.6.0

bin mit

Können Sie mir helfen, auf diesem:

  • dieser Fehler in 1.6.0 vorkommendes Ist immer noch?
  • Gibt es einen einfachen Weg, dies zu vermeiden?

PS: Ich verarbeite große Datei> 10Go.

Vielen Dank im Voraus für Ihre Antwort.

+0

Das JIRA ist immer noch "ungelöst" und es ist offensichtlich, dass niemand daran arbeitet, also warum fragst du? Finden Sie einfach einen Workaround ... –

+0

Haben Sie eine Lösung gefunden? Ich habe das gleiche Problem –

Antwort

0

Mögliche Lösungen:

  • zu HiveServer2 über JDBC verbinden und lassen Hive die Deserialisierung tun - könnte chaotisch CLASSPATH richtig zu machen, könnte die Hölle w/o Parallelisierung mit dem Datenvolumen zu bewältigen sein out of the box ...
  • lesen Sie die direkt CSV, die "alte Schule" CSV-Parser verwenden, und einen Weg finden, den Header (vgl that question zum Beispiel) überspringen - alte Schule, ja
  • lesen die CSV direkt, mit der Spark-CSV plugin mit Option "Header" - klar, das ist der Weg zu gehen (aber die Abhängigkeit von Apache commons-csv.jar dagegen, die in der Dokumentation explizit gemacht werden soll ...)

Beachten Sie, dass, wenn die CSV-Datei schlagen (n) direkt, Sie den Vorteil, dass die Hive Metastore verstecken verlieren das eigentliche HDFS-Verzeichnis (oder Verzeichnisse, falls die Tabelle partitioniert ist) - damit sind Sie wieder in der Lage, Pfade in Ihrem Code fest zu codieren.

Oder, wenn Sie eine tragbare Lösung wollen, können Sie die Hive Java API-connect to the MetaStore, navigieren für die Tabelle, die Sie wollen (und möglicherweise seine Partitionen), erhalten die (Liste) HDFS Verzeichnis (s) zum StorageDescriptor verwenden, dann drücke die Dateien darin. Sollen Sie diese Quest betreten, junger Paladin ...?   B-)

2

Ich lief in das gleiche Problem, aber wenn Sie die gleiche Tabelle wie ORC speichern, sollte es funktionieren. Erstellen Sie einfach eine neue Tabelle mit demselben Schema wie Ihr ursprüngliches, aber setzen Sie das Format auf ORC. Dann füllen Sie die Daten aus der Originaltabelle in den ORC ein.

Wenn Sie die ORC-Tabelle von Spark lesen, sollte es die Kopfzeile nicht bringen.

Hoffe, dass hilft!