wake-up-neo.com

variable/Parameter in Spark SQL dynamisch binden?

Wie binde ich eine Variable in Apache Spark SQL? Zum Beispiel:

val sqlContext = new org.Apache.spark.sql.Hive.HiveContext(sc)
sqlContext.sql("SELECT * FROM src WHERE col1 = ${VAL1}").collect().foreach(println)
11
user3769729

Spark SQL (Version 1.6) unterstützt keine Bindungsvariablen.

ps. Was Ashrith vorschlägt, ist keine Bindungsvariable. Sie konstruieren jedes Mal eine Zeichenfolge. Jede Zeit Spark wird die Abfrage parsen, einen Ausführungsplan erstellen usw. Zweck der Bindungsvariablen (z. B. in RDBMS-Systemen) ist die Verkürzung der Zeit bei der Erstellung des Ausführungsplans (was bei vielen Verknüpfungen u. Spark muss über eine spezielle API verfügen, um eine Abfrage zu "parsen" und anschließend die Variablen zu "binden". Spark verfügt nicht über diese Funktionalität (Stand heute Spark 1.6).

Update 8/2018 : Ab Spark 2.3 gibt es (noch) keine Bindungsvariablen in Spark.

8
Tagar

Ich habe es sowohl in Spark Shell 2.x Shell als auch Thrift (beeline) überprüft. Ich könnte eine Variable in der Spark SQL-Abfrage mit dem Befehl set binden.

Abfrage ohne Bindevariable:

select count(1) from mytable;

Abfrage mit Bindevariable (parametrisiert):

1. Spark SQL Shell

 set key_tbl=mytable; -- setting mytable to key_tbl to use as ${key_tbl}
 select count(1) from ${key_tbl};

2. Spark Shell

spark.sql("set key_tbl=mytable")
spark.sql("select count(1) from ${key_tbl}").collect()

Bei beiden Bindungsparametern gibt die Abfrage ein identisches Ergebnis zurück.

Hinweis: Geben Sie keine Anführungszeichen für den Wert von key als Tabellennamen an.

Lassen Sie mich wissen, wenn Sie Fragen haben.

6
mrsrinivas

Probiere diese

sqlContext.sql(s"SELECT * FROM src WHERE col1 = '${VAL1}'").collect().foreach(println)
0
piyushmandovra

Pyspark 

sqlContext.sql("SELECT * FROM src WHERE col1 = {1} and col2 = {2}".format(VAL1,VAL2).collect().foreach(println)
0
Vijay Krishna