PySpark读取目录下全部parquet文件保存报错但单文件操作正常是什么原因
可能的故障原因
- schema不兼容:目录下不同parquet文件的schema存在差异,比如同名字段数据类型不一致、部分文件存在独有字段。
count()操作仅需扫描文件元信息统计行数,不需要合并全量schema处理数据,因此可以正常执行;写入操作需要对所有数据做schema对齐,就会触发报错。单个文件读写不存在schema合并的逻辑,因此可以正常运行。可通过添加参数验证:spark.read.option("mergeSchema", "true").parquet('input_folder'),如果调整后可正常写入即可确认是该问题。 - 输出目录冲突:Spark默认写入模式为
errorifexists,如果目标output_folder已经存在,写入时会直接触发报错。可补充写入模式配置验证:.write.mode("overwrite").parquet('output_folder') - 部分文件损坏/格式不标准:个别parquet文件存在元信息损坏、使用了Spark默认不支持的压缩编码或自定义parquet格式。
count()操作不需要读取全量字段数据,仅扫描统计元信息,不会触发损坏部分的读取;写入时需要读取全量字段就会报错。单个读写时如果刚好避开了损坏的文件,就会表现为正常运行。可按批次拆分读取文件定位异常文件。 - 资源不足:全量读写时需要的内存、CPU资源超过了Spark作业分配的阈值,写入时需要执行shuffle、数据落盘操作触发OOM或者超时错误。
count()操作相对轻量,资源消耗低因此可以正常返回结果。可查看Spark作业运行日志确认是否存在资源相关报错。 - 路径/文件名特殊字符问题:部分文件的文件名包含Spark不兼容的特殊字符、空格、非UTF-8编码字符,全量遍历写入时会触发路径解析错误,单独读写时使用的是转义后的路径或者刚好避开了有问题的文件,因此表现正常。
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

