Spark DataFrame含单引号的failed_rules列过滤报错问题
解决Spark DataFrame含单引号字符串的过滤问题
错误原因
你这段代码报错是因为用字符串插值生成过滤条件时,failed_rules的匹配值里包含单引号和反引号,Spark SQL解析时把这个值当成了列名,导致找不到对应的列。比如生成的过滤条件格式完全不符合SQL语法规则,自然触发解析失败。
解决方案
推荐两种靠谱的处理方式:
方法1:用类型安全的Dataset API过滤(最省心)
直接用列表达式做相等判断,Spark会自动处理字符串里的特殊符号,无需手动转义:
import org.apache.spark.sql.functions.col for (rule <- rules_wherecond) { df1.filter(col("failed_rules") === rule).show(false) }
方法2:手动转义SQL字符串里的单引号
如果一定要用SQL字符串方式,需遵循SQL转义规则:把字符串里的单引号'替换成两个单引号'',同时用单引号包裹整个匹配值:
for (rule <- rules_wherecond) { // 转义单引号,并用单引号包裹目标字符串 val escapedRule = rule.replace("'", "''") df1.filter(s"failed_rules = '$escapedRule'").show(false) }
验证结果
用上述任意一种方法替换原循环代码,就能正确过滤出failed_rules列匹配目标字符串的行,不会再出现解析错误。
内容的提问来源于stack exchange,提问作者Arvinth kumar
相关产品推荐
相关产品推荐

