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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:50:15