如何在 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 版开始)不支持绑定变量。
附言。Ashrith 的建议不是绑定变量。您每次都在构造一个字符串。每次 Spark 都会解析查询,创建执行计划等。绑定变量的目的(例如在 RDBMS 系统中)是为了缩短创建执行计划的时间(如果有很多连接等,这可能会很昂贵)。Spark 必须有一个特殊的 API 来“解析”查询,然后“绑定”变量。Spark 没有此功能(截至今天,Spark 1.6 版本)。
8/2018 更新:从 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()
两个 w/wo 绑定参数查询返回相同的结果。
注意: 不要给 key 的值加上任何引号,因为它是这里的表名。
如果有任何问题,请告诉我。
派斯帕克
sqlContext.sql("SELECT * FROM src WHERE col1 = {1} and col2 = {2}".format(VAL1,VAL2).collect().foreach(println)