You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySpark SQL表达式中使用LIKE排除指定路径的行

解决PySpark过滤Windows路径的问题

问题根源

你的代码存在两个核心问题:

  1. Python普通字符串中的\是转义符,像\p这类无效转义序列会被Python错误解析,导致传入Spark的路径和预期不符;
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 07:33:11