2016-06-21 5 views
3

Ich habe einen einfachen Scala-Code, der Daten aus der Hive-Datenbank abruft und eine RDD aus der Ergebnismenge erstellt. Es funktioniert gut mit HiveContext. Der Code ähnelt diesem:Wie die Datenbank in SparkSQL über Hive in Spark 1.3 angegeben werden

val hc = new HiveContext(sc) 
val mySql = "select PRODUCT_CODE, DATA_UNIT from account" 
hc.sql("use myDatabase") 
val rdd = hc.sql(mySql).rdd 

Die Version von Spark, die ich verwende, ist 1.3. Das Problem ist, dass die Standardeinstellung für hive.execution.engine 'mr' ist, die Hive veranlasst, MapReduce zu verwenden, was langsam ist. Leider kann ich es nicht zwingen, "Funken" zu benutzen. Ich habe versucht, SQLContext zu verwenden, indem ich hc = new SQLContext (sc) ersetze, um zu sehen, ob sich die Leistung verbessert. Mit dieser Änderung der Linie

hc.sql("use myDatabase") 

wirft die folgende Ausnahme:

Exception in thread "main" java.lang.RuntimeException: [1.1] failure: ``insert'' expected but identifier use found 

use myDatabase 
^ 

Die Spark 1.3 Dokumentation sagt, dass SparkSQL mit Hive Tabellen arbeiten können. Meine Frage ist, wie ich angeben soll, dass ich eine bestimmte Datenbank anstelle der Standarddatenbank verwenden möchte.

+0

Haben Sie versucht, den regulären Hive Syntax zB 'Select * von mydb.mytable'? –

+0

Ja - einen weiteren Fehler erhalten: java.lang.RuntimeException: Tabelle nicht gefunden: myDatabase.account –

Antwort

2

Gehen Sie zurück zum Erstellen des HiveContext. Der Hive-Kontext gibt Ihnen die Möglichkeit, einen Datenrahmen zu erstellen, indem Sie den Metapher von Hive verwenden. Spark verwendet nur den Metaspeicher aus der Struktur und verwendet die Struktur nicht als Verarbeitungsmodul zum Abrufen der Daten. Also, wenn Sie den df mit Ihrer SQL-Abfrage erstellen, ist es wirklich nur Fragen Hive Metastore "Wo ist die Daten, und was ist das Format der Daten" Spark

Spark nimmt diese Informationen, und wird Prozess gegen die zugrunde liegenden Daten auf der HDFS. So führt Spark die Abfrage aus, nicht die Struktur.

Wenn Sie den sqlContext erstellen, entfernen Sie die Verbindung zwischen Spark und dem Hive-Metastore. Der Fehler besagt also, dass er nicht versteht, was Sie tun möchten.

+0

Vielen Dank, Joe, für Ihren Kommentar. Ich habe HiveContext verwendet und festgestellt, dass die Abfrage bei einer großen Datenmenge sehr langsam abläuft. Ich benutze Spark 1.3 und habe keine Kontrolle über das Upgrade auf 1.5+. Leider ist in meiner Umgebung 'hive.execution.engine' auf 'mr' gesetzt, was bewirkt, dass Hive viel langsamer läuft, als wenn es auf 'spark' gesetzt wäre. Also wollte ich Spark mehr Kontrolle geben, indem ich sqlContext anstelle von MapReduce verwendete, um Abfragen auszuführen. Es ist merkwürdig, dass, während Spark behauptet, Hive zu unterstützen, es den Datenbank-Teil davon nicht versteht, der nur ein Unterverzeichnis des Standard-ist. –

+0

Hive führt keine Verarbeitung aus, daher führt MR keine Verarbeitung durch. Spark versteht den Datenbank-Teil davon, er bekommt all diese Informationen vom Metastore. SparkSQL verarbeitet dann die Daten aus dem HDFS. –

+1

Joe, Sorry, aber ich verstehe nicht, wie es meine Frage beantwortet –