PySpark指定Schema读取CSV文件报错且返回空DataFrame如何解决?
问题解决步骤
- 校验原始CSV行格式
你已经能读取到表头,说明表头行的分隔符配置正确,但数据行可能存在实际分隔符不匹配、隐藏字符、格式错位的问题,可先加载原始未解析的行确认结构:
# 不指定schema、不读取表头,查看前5行原始数据结构 spark.read.csv(file, header=False, limit=5).show(truncate=False)
如果输出的每行内容全部挤在第一列,说明分隔符配置错误,替换为实际的分隔符即可。
- 排查数据与schema不匹配问题
Spark默认会直接丢弃和指定schema格式不匹配的行,这是你拿到空DataFrame的核心原因。可开启坏记录保留配置定位具体错误:
# 扩展schema增加坏记录存储列 schema_with_corrupt = customSchema.add("_corrupt_record", StringType()) df = spark.read \ .option("header", "true") \ .option("delimiter", ";") \ .option("mode", "PERMISSIVE") \ .option("columnNameOfCorruptRecord", "_corrupt_record") \ .schema(schema_with_corrupt) \ .csv(file) # 输出解析失败的记录排查问题 df.filter(df._corrupt_record.isNotNull()).show(truncate=False)
常见匹配失败场景:
- 定义为
IntegerType的列实际存在非数字内容、空字符串(空字符串不会默认转为null,会判定为类型不匹配) - 数据行存在未转义的引号、换行符,导致行读取错位
- 补充兼容配置适配特殊CSV格式
根据上一步排查到的问题,补充对应读取配置即可正常加载,常用配置参考:
df = spark.read \ .option("header", "true") \ .option("delimiter", ";") \ .option("quote", "\"") # 字段用双引号包裹的场景 .option("escape", "\"") # 转义符和引号一致的场景 .option("nullValue", "") # 将空字符串转为null,适配整数列空值场景 .option("encoding", "UTF-8") # 非UTF-8编码文件替换为对应编码,比如GBK .schema(customSchema) \ .csv(file)
上述配置同时也能解决最初无法自动推断schema的报错。
内容的提问来源于stack exchange,提问作者amoreno
相关产品推荐
相关产品推荐

