假设SchemaRDD rdd
具有注册表customer
。您想根据用户输入过滤掉记录。您可能有如何做到这一点的一个想法如下:
rdd.sqlContext.sql(s"SELECT * FROM customer WHERE name='$userInput'")
然而,自从PHP的旧时代以来,我们知道这会导致令人讨厌的事情。
是否有相当于PreparedStatement?我能找到的唯一与远程相关的东西是org.apache.commons.lang.StringEscapeUtils.escapeSql
。
答案 0 :(得分:1)
一种选择是使用thriftserver to expose jdbc,然后可以使用常规技术(PreparedStatement等)来阻止sql注入。
答案 1 :(得分:0)
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。