动态绑定Spark SQL中的变量/参数?

use*_*729 13 scala apache-spark apache-spark-sql apache-spark-2.0

如何在Apache Spark SQL中绑定变量?例如:

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

Tag*_*gar 14

Spark SQL(从1.6发行版开始)不支持绑定变量.

PS.Ashrith建议的不是绑定变量..你每次都在构造一个字符串.Evey时间Spark将解析查询,创建执行计划等.绑定变量的目的(例如在RDBMS系统中)是为了减少创建执行计划的时间(在存在大量连接的情况下这可能是昂贵的).Spark必须有一个特殊的API来"解析"一个查询,然后"绑定"变量.Spark没有这个功能(截至今天,Spark 1.6发布).

更新8/2018:从Spark 2.3开始,Spark中仍然没有绑定变量.


mrs*_*vas 10

我在Spark shell 2.x shell和Thrift(beeline)中都验证了它.我能够使用set命令在Spark SQL查询中绑定变量.

查询没有绑定变量:

select count(1) from mytable;
Run Code Online (Sandbox Code Playgroud)

使用绑定变量查询(参数化):

1. Spark SQL shell

 set key_tbl=mytable; -- setting mytable to key_tbl to use as ${key_tbl}
 select count(1) from ${key_tbl};
Run Code Online (Sandbox Code Playgroud)

2.火花壳

spark.sql("set key_tbl=mytable")
spark.sql("select count(1) from ${key_tbl}").collect()
Run Code Online (Sandbox Code Playgroud)

w/wo绑定params查询返回相同的结果.

注意: 请勿在此处为表名提供任何引号.

如果有任何问题,请告诉我.

  • 这些不是绑定变量。 (3认同)
  • @neverMind 请参阅上面我单独的答案,为什么这些不是绑定变量。绑定变量必须得到后端(本例中为 Spark)的支持。它是特定于 RDBMS 系统的行业术语。绑定变量允许您在后端创建执行计划的准备版本,并使用(可能是绑定变量的不同值)执行(多次)相同的准备语句,而无需重新分析查询、重新创建执行计划(其中可能会很昂贵)。Spark 不支持此功能。仅将文字值替换为 SQL 文本并不会使其成为绑定变量。 (2认同)