Spark读取Parquet文件出现datetime错误 配置参数不生效问题咨询
问题原因
- 配置作用域不匹配:你通过
spark.conf.set()在PySpark代码单元格中设置的参数仅作用于当前PySpark会话上下文,EMR Studio的%sql魔法命令使用独立的SQL会话上下文,默认不会继承PySpark单元格的配置,因此你之前的参数修改对%sql查询不生效。你通过代码创建的视图是在配置过参数的PySpark会话中运行,所以查询正常,和你的推测一致,问题确实出在%sql查询的场景下。 - 缺少INT96类型时间戳的兼容配置:你仅配置了普通datetime类型的重基参数,遗漏了
spark.sql.legacy.parquet.int96RebaseModeInRead参数。旧版Spark 2.x、Hive写入Parquet时通常会将时间戳字段存储为INT96格式,Spark 3.x读取这类格式的时间戳也需要单独配置兼容规则,否则依然会触发日历兼容报错。
解决方案
你可以根据使用场景选择以下任意一种方案解决问题:
- 临时生效(仅当前%sql会话有效):在执行查询前,先在%sql单元格中执行以下配置语句:
SET spark.sql.legacy.parquet.datetimeRebaseModeInRead = LEGACY; SET spark.sql.legacy.parquet.int96RebaseModeInRead = LEGACY;
配置完成后再执行你的查询语句即可正常返回结果。
- 全局生效(整个EMR集群所有Spark任务都生效):创建EMR集群时,在软件配置项中添加如下配置:
[ { "Classification": "spark-defaults", "Properties": { "spark.sql.legacy.parquet.datetimeRebaseModeInRead": "LEGACY", "spark.sql.legacy.parquet.int96RebaseModeInRead": "LEGACY" } } ]
如果你不需要对旧版日历的时间做重基校正,直接读取原始值,可以将上述配置中的LEGACY替换为CORRECTED。
内容的提问来源于stack exchange,提问作者JAT
相关产品推荐
相关产品推荐

