>假设一个 SchemaRDD rdd
,并customer
注册表。您希望根据用户输入筛选出记录。您可能知道如何执行此操作的一个想法如下:
rdd.sqlContext.sql(s"SELECT * FROM customer WHERE name='$userInput'")
但是,从PHP的旧时代开始,我们就知道这可能会导致令人讨厌的事情。是否有等效的准备声明?我唯一能找到的看起来远程相关的是org.apache.commons.lang.StringEscapeUtils.escapeSql
.
一种选择是使用节俭服务器来公开jdbc,然后可以使用常用的技术(PreparedStatement等)来防止SQL注入。
def safeSql(query,**args):
spark.udf.register("arg", lambda x: args[x])
return(spark.sql(query))
safeSql("select arg('a'),arg('b')",a=4,b="O'Malley").show()
以上是在pyspark中,但可以用Scala或其他语言完成。诀窍是注册一个 udf。
有关如何在pyspark 3.3.0+中使用内置功能执行此操作,请参阅此处的答案。