Spark读取多级子目录下parquet文件时schema推断报错如何解决
报错原因
该报错本质是Spark开启递归文件查找后,无法自动识别所有待读取parquet文件的统一schema,常见诱因如下:
- 子目录下的多个parquet文件schema存在差异(字段名、字段类型不一致)
- 目录下存在损坏、为空的parquet文件
- Spark默认采样的文件数量不足,无法完成schema推断
解决方案
方案1:手动指定Schema(最稳定,优先推荐)
提前明确定义读取的schema,传入读取方法中,Scala示例代码如下,PySpark可替换为对应Python版Schema定义API,逻辑完全一致:
import org.apache.spark.sql.types._ // 按照实际parquet的字段定义schema val customSchema = StructType(Seq( StructField("id", IntegerType, nullable = true), StructField("name", StringType, nullable = true), StructField("create_time", TimestampType, nullable = true) )) sparkSession.read.format("parquet") .option("recursiveFileLookup", "true") .schema(customSchema) // 传入手动定义的schema .load("dir1path")
方案2:开启Schema合并(适用于所有parquet schema同源、仅存在字段增减的场景)
开启parquet的schema合并选项,让Spark自动合并所有文件的schema:
sparkSession.read.format("parquet") .option("recursiveFileLookup", "true") .option("mergeSchema", "true") // 开启schema合并 .load("dir1path")
方案3:前置校验排除文件问题
如果上述方案不生效,先做如下检查:
- 确认
dir1path路径配置正确,Spark进程拥有所有子目录、parquet文件的读取权限 - 分别读取
dir1-1/file1.parquet和dir1-2/file2.parquet,校验单个文件是否能正常读取,排除文件损坏、为空的问题 - 校验两个parquet文件的schema是否兼容,避免存在同名字段类型完全不一致的情况
内容的提问来源于stack exchange,提问作者kailing
相关产品推荐
相关产品推荐

