假设 SchemaRDD
rdd
带有注册表 customer
。您想要根据用户输入过滤掉记录。您可能知道如何执行此操作的一个想法如下:
rdd.sqlContext.sql(s"SELECT * FROM customer WHERE name='$userInput'")
但是,从 PHP 的旧时代开始,我们就知道这可能会导致令人讨厌的事情。 是否有相当于PreparedStatement 的东西?我能找到的唯一看起来远程相关的是
org.apache.commons.lang.StringEscapeUtils.escapeSql
。
一种选择是使用 thriftserver 公开 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+ 中执行此操作。