如何在PySpark SQL表达式中使用LIKE排除指定路径的行
解决PySpark过滤Windows路径的问题
问题根源
你的代码存在两个核心问题:
- Python普通字符串中的
\是转义符,像\p这类无效转义序列会被Python错误解析,导致传入Spark的路径和预期不符; - Spark SQL的
LIKE语句默认用\作为转义符,路径中的\需要额外转义才能被当作普通字符匹配。
可行解决方案
方案1:Python原始字符串 + Spark转义\
用Python原始字符串(r'')保留路径中的\,同时在Spark匹配模式里把每个\写成\\(让Spark识别为普通的\):
df = spark.createDataFrame([r"c:\somepath", r"d:\somepath", r"c:\part1\part2\part3\something1", r"c:\part1\part2\part3\something2"], "string").toDF("file_path") path_filter = r"NOT (file_path LIKE 'c:\\part1\\part2\\part3\\%')" df_filtered = df.filter(path_filter) df_filtered.show()
执行后会保留前两行符合预期。
方案2:Python双重转义 + Spark转义\
如果不用原始字符串,需要在Python里用\\\\表示一个\\(Python解析后传给Spark的是\\,Spark再解析成普通的\):
df = spark.createDataFrame(["c:\\somepath", "d:\\somepath", "c:\\part1\\part2\\part3\\something1", "c:\\part1\\part2\\part3\\something2"], "string").toDF("file_path") path_filter = "NOT (file_path LIKE 'c:\\\\part1\\\\part2\\\\part3\\\\%')" df_filtered = df.filter(path_filter) df_filtered.show()
方案3:指定自定义转义字符
修改Spark的转义字符为其他符号(比如|),这样路径中的\不需要额外转义,直接用Python原始字符串即可:
df = spark.createDataFrame([r"c:\somepath", r"d:\somepath", r"c:\part1\part2\part3\something1", r"c:\part1\part2\part3\something2"], "string").toDF("file_path") path_filter = r"NOT (file_path LIKE 'c:\part1\part2\part3\%' ESCAPE '|')" df_filtered = df.filter(path_filter) df_filtered.show()
关键注意点
- 创建DataFrame时,路径字符串也要正确转义:要么用原始字符串
r'',要么用\\代替\,否则Python会错误解析路径中的转义序列; - Spark的
LIKE中,%是匹配任意字符的通配符,你之前写的\%是错误的——只有要匹配真实的%字符时才需要转义,这里直接写%即可。
内容的提问来源于stack exchange,提问作者Lost in ML
相关产品推荐
相关产品推荐

