如何用正则表达式优化PySpark代码解决CSV数据截断问题
PySpark处理CSV时正则异常及列值截断的修复方案
原代码存在的问题
dffs_headers = dff.dtypes被注释,循环遍历会直接报错,必须解开注释才能获取列信息withColumn后立刻执行drop(newColumnLabel)是致命错误:刚生成清洗后的列就删掉,等于没做任何值清洗操作- 正则表达式转义冗余:
^\\‡‡|\\‡‡$里的反斜杠多余,‡不是正则特殊字符,无需转义 - 列处理逻辑顺序混乱:应该先生成清洗后的列值,再删除原列,而非反过来
修正后的代码
from pyspark.sql.functions import regexp_replace path="dbfs:/FileStore/df/test.csv" # 读取CSV,保留原参数配置 dff = spark.read.option("header", "true")\ .option("inferSchema", "true")\ .option('multiline', 'true')\ .option('encoding', 'UTF-8')\ .option("delimiter", "‡‡,‡‡")\ .csv(path) # 解开注释,获取列信息(也可直接用dff.columns遍历列名) dffs_headers = dff.dtypes for i in dffs_headers: columnLabel = i[0] print(columnLabel) # 清洗列名:移除所有‡‡字符 newColumnLabel = columnLabel.replace('‡‡', '') # 清洗列值:移除首尾的‡‡,结果存入新列 dff = dff.withColumn(newColumnLabel, regexp_replace(columnLabel, r'^‡‡|‡‡$', '')) # 删除原始列 if columnLabel != newColumnLabel: dff = dff.drop(columnLabel) # 查看最终处理结果 dff.show(truncate=False)
简化版(直接遍历列名)
如果不需要列类型信息,用dff.columns遍历更简洁:
from pyspark.sql.functions import regexp_replace path="dbfs:/FileStore/df/test.csv" dff = spark.read.option("header", "true")\ .option("inferSchema", "true")\ .option('multiline', 'true')\ .option('encoding', 'UTF-8')\ .option("delimiter", "‡‡,‡‡")\ .csv(path) for columnLabel in dff.columns: newColumnLabel = columnLabel.replace('‡‡', '') dff = dff.withColumn(newColumnLabel, regexp_replace(columnLabel, r'^‡‡|‡‡$', '')) if columnLabel != newColumnLabel: dff = dff.drop(columnLabel) dff.show(truncate=False)
修改说明
- 解开列信息获取的注释,确保能遍历所有目标列
- 移除
withColumn后错误的drop操作,保留清洗后的列数据 - 使用原始字符串
r'^‡‡|‡‡$'简化正则,精准匹配并移除列值首尾的‡‡ - 调整逻辑顺序:先生成清洗后的列→再删除原列,保证数据完整保留
内容的提问来源于stack exchange,提问作者thedataengineer
相关产品推荐
相关产品推荐

