web-dev-qa-db-ja.com

Spark SQLで変数/パラメータを動的にバインドしますか?

Apacheで変数をバインドする方法Spark SQL?例:

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

Spark SQL(1.6リリース以降)はバインド変数をサポートしていません。

ps。 Ashrithが示唆しているのはバインド変数ではありません。毎回文字列を作成しています。 Evey time Sparkはクエリを解析し、実行プランを作成します。など)バインド変数(RDBMSシステムなど)の目的は、実行プランの作成時間を短縮することです(これは、 Sparkクエリを「解析」してから変数を「バインド」するための特別なAPIが必要です。Sparkにはこれがありません機能(今日、Spark 1.6リリース)。

2018年8月更新:Spark 2.3現在、Sparkにはバインド変数が(まだ)ありません)。

14
Tagar

Spark Shell 2.x ShellとThrift(beeline)の両方で確認しました。 Spark SQLクエリでsetコマンドを使用して変数をバインドできました。

バインド変数のないクエリ:

select count(1) from mytable;

バインド変数を使用したクエリ(パラメータ化):

1。Spark SQLシェル

 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()

W/w.o bind paramsの両方で、クエリは同じ結果を返します。

注:keyの値には引用符を付けないでくださいここではテーブル名を使用しています。

質問がある場合はお知らせください。

11
mrsrinivas

これらをお試しください

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

ピスパーク

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