【问题标题】:dynamically bind variable/parameter in Spark SQL?在 Spark SQL 中动态绑定变量/参数?
【发布时间】:2015-01-01 12:41:21
【问题描述】:

如何在 Apache Spark SQL 中绑定变量?例如:

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
sqlContext.sql("SELECT * FROM src WHERE col1 = ${VAL1}").collect().foreach(println)

【问题讨论】:

    标签: scala apache-spark apache-spark-sql apache-spark-2.0


    【解决方案1】:

    Spark SQL(从 1.6 版开始)不支持绑定变量。

    ps。 Ashrith 的建议不是绑定变量。您每次都在构造一个字符串。每次 Spark 都会解析查询、创建执行计划等。绑定变量的目的(例如在 RDBMS 系统中)是为了缩短创建执行计划的时间(如果有很多连接等,这可能会很昂贵)。 Spark 必须有一个特殊的 API 来“解析”查询,然后“绑定”变量。 Spark 没有此功能(截至今天,Spark 1.6 版本)。

    8/2018 更新:从 Spark 2.3 开始,Spark 中(仍然)没有绑定变量。

    【讨论】:

      【解决方案2】:

      我也在 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()
      

      查询返回相同的结果。

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

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

      【讨论】:

      • with val slqDF = spark.sql("select count(*) from Prd_IN_GeneralEvents where pdid like $'{id}'") 相同的错误
      • 那些不是绑定变量。
      • @Tagar 你能解释一下为什么这些不是绑定变量吗?因为 f-strings 似乎不是可行的方法
      • @neverMind 请在上面查看我的单独答案,为什么这些不是绑定变量。绑定变量必须由后端支持(在本例中为 Spark)。这是一个特定于 RDBMS 系统的行业术语。绑定变量允许您在后端创建执行计划的准备版本,并使用(可能是绑定变量的不同值)执行(多次)相同的准备语句,而无需重新分析查询,重新创建执行计划(可能很昂贵)。 Spark 不支持此功能。仅将文字值替换为 SQL 文本不会使其成为绑定变量。
      【解决方案3】:

      派斯帕克

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

      【讨论】:

      • 这就是您如何将 SQL 注入漏洞引入您的应用程序。在 SQL 语句中插入一些变量而没有正确转义它们几乎总是错误的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 2018-02-26
      • 2015-01-18
      • 1970-01-01
      • 2019-08-24
      • 2013-07-08
      • 2020-01-16
      相关资源
      最近更新 更多