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

时间:2014-11-05 10:44:25

标签: 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)

4 个答案:

答案 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)