16

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

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.sql("SELECT * FROM src WHERE col1 = ${VAL1}").collect().foreach(println)
4

3 に答える 3

15

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

ps。Ashrith が示唆しているのはバインド変数ではありません。毎回文字列を作成しています。Spark がクエリを解析し、実行計画などを作成するたびに。バインド変数の目的 (RDBMS システムなど) は、実行計画の作成にかかる時間を短縮することです (多くの結合などがある場合、コストがかかる可能性があります)。Spark には、クエリを「解析」してから変数を「バインド」するための特別な API が必要です。Spark にはこの機能がありません (現在、Spark 1.6 リリース)。

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

于 2015-09-11T00:39:01.160 に答える
12

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

バインド変数を使用しないクエリ:

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.sql("set key_tbl=mytable")
spark.sql("select count(1) from ${key_tbl}").collect()

バインド パラメータを使用しない場合でも、クエリは同じ結果を返します。

注: ここではテーブル名であるため、キーの値に引用符を付けないでください。

ご不明な点がございましたら、お知らせください。

于 2016-11-22T06:18:38.480 に答える
-1

ピスパーク

sqlContext.sql("SELECT * FROM src WHERE col1 = {1} and col2 = {2}".format(VAL1,VAL2).collect().foreach(println)
于 2017-10-17T07:19:57.287 に答える