Spark regexp_extract提取含反斜杠路径首层级的问题
解决Spark DataFrame提取含反斜杠路径首层级的问题
问题分析
你需要从格式为\folderX\folderY\...的repo_path字段中提取首个层级(如\folder1、\folderA),但原正则存在语法错误和转义逻辑错误,同时Spark对反斜杠的转义规则与Athena不同,导致无法得到预期结果。
核心问题点
- 正则语法错误:原正则
'(\\(\\w*){2})'括号不匹配,出现多余的(和),直接引发解析报错。 - 反斜杠转义错误:Spark中反斜杠需要双重转义(语言层面转义+正则引擎转义),原正则的转义方式不符合Spark要求,无法正确匹配实际的反斜杠字符。
- 正则逻辑偏差:原正则逻辑是匹配两次
(\w*),与提取首层级的需求完全不符。
解决方案
方案一:使用正则表达式(推荐精准匹配场景)
Spark SQL 写法
SELECT df.*, regexp_extract(repo_path, '^(\\\\\\w+)', 1) AS split_path FROM myDataFrame
或者更通用的版本(适配含特殊字符的文件夹名):
SELECT df.*, regexp_extract(repo_path, '^(\\\\.*?)(?=\\\\)', 0) AS split_path FROM myDataFrame
解释
^:匹配字符串开头\\\\:SQL字符串中需用4个反斜杠表示正则引擎中的1个实际反斜杠(SQL层面转义一次,正则层面转义一次)\\w+:匹配1个及以上单词字符(对应folder1这类名称).*?:非贪婪匹配任意字符,直到遇到下一个反斜杠(由(?=\\\\)正向预查实现)1/0:1表示取第一个分组结果,0表示取整个正则匹配结果
DataFrame API(Python)写法
使用原始字符串r''避免Python层面的反斜杠转义:
from pyspark.sql.functions import col, regexp_extract # 精准匹配单词字符的文件夹名 df = myDataFrame.withColumn( 'split_path', regexp_extract(col('repo_path'), r'^(\\\w+)', 1) ) # 通用匹配任意字符的文件夹名 df = myDataFrame.withColumn( 'split_path', regexp_extract(col('repo_path'), r'^(\\.*?)(?=\\)', 0) )
方案二:使用分割函数(直观简单场景)
无需正则,通过split+element_at实现:
from pyspark.sql.functions import split, element_at, concat, lit df = myDataFrame.withColumn( 'split_part', element_at(split(col('repo_path'), r'\\'), 2) ).withColumn( 'split_path', concat(lit('\\'), col('split_part')) ).drop('split_part')
解释
split(col('repo_path'), r'\\'):按反斜杠分割字符串,得到数组如['', 'folder1', 'folder2', ...]element_at(..., 2):取数组第二个元素(即folder1)concat(lit('\\'), ...):拼接开头的反斜杠,得到最终的\folder1
内容的提问来源于stack exchange,提问作者Gon
相关产品推荐
相关产品推荐

