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