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 版开始)不支持绑定变量。

附言。Ashrith 的建议不是绑定变量。您每次都在构造一个字符串。每次 Spark 都会解析查询,创建执行计划等。绑定变量的目的(例如在 RDBMS 系统中)是为了缩短创建执行计划的时间(如果有很多连接等,这可能会很昂贵)。Spark 必须有一个特殊的 API 来“解析”查询,然后“绑定”变量。Spark 没有此功能(截至今天,Spark 1.6 版本)。

8/2018 更新:从 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()

两个 w/wo 绑定参数查询返回相同的结果。

注意: 不要给 key 的值加上任何引号,因为它是这里的表名。

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

于 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 回答