如何在Apache Spark SQL中绑定变量?例如:
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.sql("SELECT * FROM src WHERE col1 = ${VAL1}").collect().foreach(println)
答案 0 :(得分:11)
Spark SQL(从1.6发行版开始)不支持绑定变量。
PS。 Ashrith建议的不是绑定变量..你每次都在构造一个字符串。 Evey时间Spark将解析查询,创建执行计划等。绑定变量的目的(例如在RDBMS系统中)是为了减少创建执行计划的时间(在存在大量连接的情况下这可能是昂贵的)。 Spark必须有一个特殊的API来“解析”一个查询,然后“绑定”变量。 Spark没有此功能(截至今天,Spark 1.6发布)。
更新8/2018 :从Spark 2.3开始,Spark中仍然没有绑定变量。
答案 1 :(得分:7)
我在 Spark shell 2.x shell和 Thrift(beeline)中验证了它。我能够使用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 shell
spark.sql("set key_tbl=mytable") spark.sql("select count(1) from ${key_tbl}").collect()
w / w.o bind params查询返回相同的结果。
注意:不要在此处给出值的任何引号作为它的表名。
如果有任何问题,请告诉我。
答案 2 :(得分:0)
Pyspark
sqlContext.sql("SELECT * FROM src WHERE col1 = {1} and col2 = {2}".format(VAL1,VAL2).collect().foreach(println)
答案 3 :(得分:0)
尝试这些
sqlContext.sql(s"SELECT * FROM src WHERE col1 = '${VAL1}'").collect().foreach(println)