Databricks中PySpark正则替换特殊字符、删除列报错求解
问题场景
- 读取分隔符为
|的CSV文件生成DataFrame,原始读取代码如下:
dt = pd.read_csv(StringIO(response.text), delimiter="|", encoding='utf-8-sig')
- 读取后发现列名存在特殊字符
,同时需要删除第一列 - 自行编写的正则替换代码运行触发语法错误,错误代码如下:
dt.withColumn('COUNTRY ID', regexp_replace('COUNTRY ID', @"[^0-9a-zA-Z_]+"_ ""))
错误原因
- API混用:
withColumn、regexp_replace是PySpark DataFrame的内置方法,Pandas库没有对应接口,在Pandas对象上直接调用会抛出属性错误 - 语法错误:Python正则表达式不需要添加
@前缀,正则参数分隔格式不符合Python语法要求,会触发语法解析错误 - 乱码根源:
是UTF-8 BOM头被错误解析后的产物,说明源文件编码和读取时指定的编码匹配存在偏差
解决方法
根据你实际使用的库选择对应方案即可:
方案1:Pandas环境实现
优先在读取阶段处理异常,减少后续清洗逻辑:
import pandas as pd from io import StringIO # 读取时自动过滤空值第一列,指定编码处理BOM头 dt = pd.read_csv( StringIO(response.text), delimiter="|", encoding='utf-8-sig', usecols=lambda col: not col.startswith('Unnamed') ) # 批量清理所有列名中的乱码字符,仅保留数字、字母、下划线、空格 dt.columns = dt.columns.str.replace(r'[^0-9a-zA-Z_\s]+', '', regex=True)
如果读取后仍残留开头的异常列名,可以补充以下处理逻辑:
# 移除列名中的乱码前缀 dt.columns = [col.replace('', '') for col in dt.columns] # 删除第一列 dt = dt.iloc[:, 1:]
方案2:PySpark环境实现
修正API调用和正则写法即可:
from pyspark.sql.functions import regexp_replace dt = dt.withColumnRenamed('COUNTRY ID', 'COUNTRY ID') \ .withColumn('COUNTRY ID', regexp_replace('COUNTRY ID', r'[^0-9a-zA-Z_]+', '')) \ .drop(dt.columns[0])
内容的提问来源于stack exchange,提问作者Patterson
相关产品推荐
相关产品推荐

