PySpark读取Parquet文件报错:Illegal Parquet type: INT64 (TIME(MICROS,false))
问题:PySpark读取Parquet文件时出现Illegal Parquet type错误
在Databricks使用PySpark读取一批Parquet文件时,部分文件可正常读取,但部分文件报错。在IDE中读取这些异常文件时,得到如下错误信息:
24/02/27 13:39:54 ERROR Executor: Exception in task 0.0 in stage 0.0 (TID 0)/ 1] org.apache.spark.sql.AnalysisException: Illegal Parquet type: INT64 (TIME(MICROS,false)). at org.apache.spark.sql.errors.QueryCompilationErrors$.illegalParquetTypeError(QueryCompilationErrors.scala:1762) at org.apache.spark.sql.execution.datasources.parquet.ParquetToSparkSchemaConverter.illegalType$1(ParquetSchemaConverter.scala:206) at org.apache.spark.sql.execution.datasources.parquet.ParquetToSparkSchemaConverter.$anonfun$convertPrimitiveField$2(ParquetSchemaConverter.scala:283) at scala.Option.getOrElse(Option.scala:189)
错误含义
Spark的Parquet Schema转换器无法识别以INT64类型存储的TIME(MICROS,false)类型。Parquet规范中TIME类型存在多种存储方式,而异常文件中的TIME字段采用微秒级INT64存储,当前使用的Spark版本的Parquet转换器不支持这种类型映射,导致解析失败。
解决方法
- 升级Spark版本:Spark 3.3及以上版本已修复这类Parquet类型兼容问题,对TIME类型的多种存储格式支持更完善,升级后可直接解决该问题。
- 手动指定Schema读取:若无法升级Spark,可自定义Schema将报错的TIME字段指定为
LongType或TimestampType,读取后再转换为目标类型。示例代码:
from pyspark.sql.types import StructType, StructField, LongType, TimestampType # 自定义Schema,替换为实际字段结构 custom_schema = StructType([ StructField("problem_time_col", LongType(), nullable=True), # 其他字段定义... ]) # 使用自定义Schema读取文件 df = spark.read.schema(custom_schema).parquet("path/to/your/parquet/files") # 可选:将Long类型的微秒值转换为Timestamp类型 df = df.withColumn("problem_time_col", (df["problem_time_col"] / 1000000).cast(TimestampType()))
- 修复源文件Schema:若有权限修改源文件,重新生成Parquet时将TIME字段转换为Spark兼容的格式(如改用Timestamp类型存储,或调整TIME存储精度为Spark支持的类型)。
- 预处理异常文件:使用
parquet-tools等Parquet工具修改异常文件的Schema,将INT64存储的TIME字段转换为Spark可识别的类型。
内容的提问来源于stack exchange,提问作者Aditya Raj
相关产品推荐
相关产品推荐

