Apacheで変数をバインドする方法Spark SQL?例:
val sqlContext = new org.Apache.spark.sql.Hive.HiveContext(sc)
sqlContext.sql("SELECT * FROM src WHERE col1 = ${VAL1}").collect().foreach(println)
Spark SQL(1.6リリース以降)はバインド変数をサポートしていません。
ps。 Ashrithが示唆しているのはバインド変数ではありません。毎回文字列を作成しています。 Evey time Sparkはクエリを解析し、実行プランを作成します。など)バインド変数(RDBMSシステムなど)の目的は、実行プランの作成時間を短縮することです(これは、 Sparkクエリを「解析」してから変数を「バインド」するための特別なAPIが必要です。Sparkにはこれがありません機能(今日、Spark 1.6リリース)。
2018年8月更新:Spark 2.3現在、Sparkにはバインド変数が(まだ)ありません)。
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の値には引用符を付けないでくださいここではテーブル名を使用しています。
質問がある場合はお知らせください。
これらをお試しください
sqlContext.sql(s"SELECT * FROM src WHERE col1 = '${VAL1}'").collect().foreach(println)
ピスパーク
sqlContext.sql("SELECT * FROM src WHERE col1 = {1} and col2 = {2}".format(VAL1,VAL2).collect().foreach(println)