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

AWS Glue Job从Data Catalog表导出Parquet至S3报错求助

Glue Job读取Data Catalog表报错:UnsupportedOperationException(PlainLongDictionary转Double失败)

问题核心

从Glue Data Catalog读取表写入S3时触发以下错误,直接读取原S3 Parquet文件则正常:

Py4JJavaError: An error occurred while calling o497.pyWriteDynamicFrame.
: org.apache.spark.SparkException: Job aborted.
...
Caused by: java.lang.UnsupportedOperationException: org.apache.parquet.column.values.dictionary.PlainValuesDictionary$PlainLongDictionary
    at org.apache.parquet.column.Dictionary.decodeToDouble(Dictionary.java:57)

根本原因:Glue Crawler生成的Catalog表中,部分字段的类型被错误识别为Double,但实际Parquet文件中这些字段是Long类型。直接读S3时Spark会自动解析文件元数据获取正确类型,而读Catalog时会强制用Catalog的Schema解析,导致类型不兼容的解码错误。

解决方案

1. 修正Glue Catalog表的字段类型

  • 登录Glue控制台,定位到目标数据库ss-demo-database和表tlc_green_data
  • 进入表的Schema页面,逐一核对字段类型与from_s3.printSchema()输出的差异,找到被标记为Double但实际应为Long的字段
  • 修改该字段的类型为Long(或匹配实际数据的数值类型),保存表结构

2. 验证Schema一致性

修改后重新运行测试Job,对比from_catalogue.printSchema()和from_s3.printSchema()的输出,确保所有字段的名称、类型完全一致。

3. 优化Crawler配置避免重复误判

如果Crawler再次错误识别类型,可通过以下方式调整:

  • 添加自定义Parquet分类器:明确指定易误判字段的类型(比如将passenger_count、trip_distance这类字段指定为Long)
  • 调整Crawler的类型推断规则:在Crawler配置中关闭自动推断小数类型,或设置数值类型的优先级,优先识别为整数类型

4. 临时修复:Job内手动修正字段类型

若暂时无法修改Catalog表,可在Job中手动转换字段类型:

# 将DynamicFrame转为Spark DataFrame
df = from_catalogue.toDF()
# 假设错误字段为trip_distance,将其从Double转为Long
df_fixed = df.withColumn("trip_distance", f.col("trip_distance").cast(LongType()))
# 转回DynamicFrame
from_catalogue_fixed = DynamicFrame.fromDF(df_fixed, glueContext, "from_catalogue_fixed")

# 使用修复后的DynamicFrame写入S3
datasink = glueContext.write_dynamic_frame_from_options(
               frame=from_catalogue_fixed,
               connection_type="s3",
               connection_options={"path": S3_location},
               format="parquet",
               format_options={"compression": "snappy"},
               transformation_ctx="datasink")

内容的提问来源于stack exchange,提问作者Nikita Voevodin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:35:34