Apache Spark SQLで変数をバインドする方法は? 例えば:
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.sql("SELECT * FROM src WHERE col1 = ${VAL1}").collect().foreach(println)
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 が示唆しているのはバインド変数ではありません。毎回文字列を作成しています。Spark がクエリを解析し、実行計画などを作成するたびに。バインド変数の目的 (RDBMS システムなど) は、実行計画の作成にかかる時間を短縮することです (多くの結合などがある場合、コストがかかる可能性があります)。Spark には、クエリを「解析」してから変数を「バインド」するための特別な API が必要です。Spark にはこの機能がありません (現在、Spark 1.6 リリース)。
2018 年 8 月更新: Spark 2.3 の時点で、Spark には (まだ) バインド変数がありません。
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()
バインド パラメータを使用しない場合でも、クエリは同じ結果を返します。
注: ここではテーブル名であるため、キーの値に引用符を付けないでください。
ご不明な点がございましたら、お知らせください。
ピスパーク
sqlContext.sql("SELECT * FROM src WHERE col1 = {1} and col2 = {2}".format(VAL1,VAL2).collect().foreach(println)