Spark SQL为何对'%''%'与'%' '%'模式返回所有非空行?
为什么Spark SQL中LIKE模式'%''%'或'%' '%'会返回所有非空行?
核心原因:Spark SQL的字符串自动拼接特性
Spark SQL有个容易被忽略的特性:相邻的字符串字面量(中间没有运算符,不管隔多少空格)会自动拼接成一个字符串,这就是你遇到问题的关键。
1. 拆解LIKE '%''%'的实际逻辑
你写的like '%''%',在Spark SQL里会被拆成两个独立的字符串:'%' 和 '%'。因为它们相邻,Spark会直接把二者拼接成'%%'。
而LIKE '%%'和LIKE '%'的效果完全一样:%是通配符,能匹配0个或多个任意字符,所以所有非空字符串都会被命中(NULL值会因为LIKE比较返回NULL,被WHERE子句过滤掉)。这就是第一个查询里a'b和a[c都被返回的原因。
2. 拆解LIKE '%' '%'的实际逻辑
同理,like '%' '%'里的空格会被Spark忽略,两个'%'依然会被自动拼接成'%%',效果等同于LIKE '%',所以所有非空行(包括不包含单引号的gefd)都会被匹配出来。
正确匹配包含单引号的字符串
如果你的真实需求是匹配包含单引号的字符串,需要正确转义单引号,写法如下:
spark.sql('''SELECT * FROM VALUES ('a\'b'), ('a[c'), (NULL) AS tab(col) where col like '%''%' ''').show()
此时只有包含单引号的a'b会被返回,符合预期。
内容的提问来源于stack exchange,提问作者vri vri
相关产品推荐
相关产品推荐

