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

如何在PySpark中访问_corrupt_record列处理CSV坏记录

问题原因

该错误由Spark SQL的谓词下推优化机制导致:当你直接对刚读取生成的DataFrame执行filter操作时,Spark优化器会尝试将过滤条件下推到CSV数据源的读取阶段,而_corrupt_record是CSV解析过程中生成的衍生列,不属于CSV文件的原生字段,读取阶段无法识别该列,因此抛出列不存在的错误。

可行解决方法

方法1:缓存DataFrame打断谓词下推

读取数据后先将DataFrame缓存到内存,切断谓词下推到数据源的链路,再执行过滤操作即可:

schema = StructType([
  StructField("Name",StringType(),True),
  StructField("ID",IntegerType(),True),
  StructField("int",IntegerType(),True),
  StructField("int2",IntegerType(),True),
  StructField("_corrupt_record", StringType(),True) 
])
df = spark.read.csv(
    'dbfs:/tmp/test_file/test_csv.csv', 
    header=True, 
    schema=schema, 
    columnNameOfCorruptRecord='_corrupt_record',
    mode='PERMISSIVE' # 显式指定宽容模式,默认也是该配置,显式声明更稳妥
)
# 先缓存数据,再执行过滤
df.cache()
badRows = df.filter("_corrupt_record is Not Null")
badRows.show()

方法2:用查询Hint禁用谓词下推

如果不想额外占用内存缓存数据,可以通过查询Hint直接禁用本次查询的过滤下推逻辑:

badRows = df.hint("DISABLE_PUSHDOWN_FILTER").filter("_corrupt_record is Not Null")
badRows.show()

方法3:全局关闭CSV读取的谓词下推(不推荐,会影响整体CSV读取性能)

如果需要频繁处理带坏记录的CSV文件,可以在当前Spark会话临时调整配置:

spark.conf.set("spark.sql.sources.pushdown.csvFilters.enabled", "false")
# 调整配置后可直接执行过滤
badRows = df.filter("_corrupt_record is Not Null")
badRows.show()

内容的提问来源于stack exchange,提问作者Sohel Reza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 14:27:00