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



如何在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绑定参数查询都返回相同的结果。

注意:键的值不要加引号,因为它是这里的表名。

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

Pyspark
sqlContext.sql("SELECT * FROM src WHERE col1 = {1} and col2 = {2}".format(VAL1,VAL2).collect().foreach(println)

相关内容

  • 没有找到相关文章

最新更新