AWS Glue 3.0 处理时间早于1900-01-01T00:00:00Z出现的问题

151 阅读1分钟

背景

在 使用AWS Glue 的ETL 工具对数据进行清洗时候,有一些时间异常的数据,倒是清洗job 报错

An error occurred while calling o118.showString. You may get a different result due to the upgrading to Spark >= 3.0:reading dates before 1582-10-15 or timestamps before 1900-01-01T00:00:00Z

看日志应该是有一些数据的时间出现了不合理的数据。

运行环境

  • Pyspark 3.3
  • AWS Glue 4.0
  • Python3

问题查找

首先用sql 找出是不是有时间类型的数据是早于1900的,果然有一条数据的时间异常

0217-01-10 00:00:00.000

image.png

AWS Glue 3.0 使用的是 Spark 3.1,改变了从/到 parquet 文件加载/保存时间戳的行为。在读取/写入包含时间戳列的 parquet 数据时,建议设置以下参数。设置这些参数可以解决 Spark 2 到 Spark 3 升级期间发生的 AWS Glue 动态帧和 Spark 数据帧的日历不兼容问题。使用 CORRECTED(更正)选项将按原样读取日期时间值;使用 LEGACY(旧式)选项将根据读取期间的日历差异重新设置日期时间值的基础 所以AWS glue 给出了一个解决方案,在Job DetailsJob parameters 功能模块中添加配置参数,更正异常

- Key: --conf
- Value: spark.sql.legacy.parquet.int96RebaseModeInRead=[CORRECTED|LEGACY] --conf spark.sql.legacy.parquet.int96RebaseModeInWrite=[CORRECTED|LEGACY] --conf spark.sql.legacy.parquet.datetimeRebaseModeInRead=[CORRECTED|LEGACY]

我的配置是

spark.sql.legacy.parquet.int96RebaseModeInRead=CORRECTED --conf spark.sql.legacy.parquet.int96RebaseModeInWrite=CORRECTED --conf spark.sql.legacy.parquet.datetimeRebaseModeInRead=CORRECTED

image.png