如何在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版本起)不支持绑定变量。
更新:Spark 3.4将具有";参数化SQL查询";https://github.com/apache/spark/pull/38864
spark.sql(
sqlText = "SELECT * FROM tbl WHERE date > :startDate LIMIT :maxRows",
args = Map(
"startDate" -> "DATE'2022-12-01'",
"maxRows" -> "100"))
以及类似的数据帧API
def sql(sqlText: String, args: Map[String, String]): DataFrame
ps。Ashrith的建议并不是一个绑定变量。。你每次都在构造一个字符串。每次Spark都会解析查询、创建执行计划等。绑定变量(例如在RDBMS系统中)的目的是缩短创建执行计划的时间(在有很多联接等的情况下,这可能会很昂贵)。Spark必须有一个特殊的API;解析";一个查询,然后转到";绑定";变量。Spark没有此功能(截至目前,Spark 1.6版本)。
更新8/2018:截至Spark 2.3,Spark中(仍然)没有绑定变量。
我在Spark shell 2.xshell和Thrift(直线)中都验证了它。我可以用set
命令在Spark SQL查询中绑定一个变量。
不带绑定变量的查询:
select count(1) from mytable;
使用绑定变量(参数化)进行查询:
1.Spark SQL shell
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/w.o绑定参数查询都返回相同的结果。
注意:键的值不要加引号,因为它是这里的表名。
如果有任何问题请告诉我。
sqlContext.sql("SELECT * FROM src WHERE col1 = {1} and col2 = {2}".format(VAL1,VAL2).collect().foreach(println)