Azure Synapse Spark处理1900年前日期Parquet配置报错求解
问题原因
你套用的是AWS Glue环境的配置逻辑,在Azure Synapse Spark中完全不适用:
- Azure Synapse Spark是托管式会话环境,不支持在Notebook代码中手动停止并重建SparkContext。会话启动时YARN ApplicationMaster已经完成了SparkContext的初始化注册,你手动调用
sc.stop()后再创建新上下文,会触发重复初始化异常,也就是你看到的Promise already completed报错。 - 代码中引用的
GlueContext是AWS Glue专属组件,Synapse Spark原生不提供,就算上下文不报错这行也跑不通。
可行配置方案
方案1:会话预配置(推荐)
直接在Spark会话或Spark池配置中提前添加以下参数,会话启动时自动加载,不需要在业务代码中加任何上下文操作:
spark.sql.legacy.parquet.int96RebaseModeInRead = CORRECTEDspark.sql.legacy.parquet.int96RebaseModeInWrite = CORRECTEDspark.sql.legacy.parquet.datetimeRebaseModeInRead = CORRECTEDspark.sql.legacy.parquet.datetimeRebaseModeInWrite = CORRECTED
如果是单个Notebook临时使用,直接在Notebook顶部的「配置会话」面板中添加以上参数即可。
方案2:代码内动态配置(无需重启会话)
如果不想修改会话配置,直接在Notebook最顶部、所有Parquet读写逻辑之前,用Notebook默认初始化好的spark对象设置参数即可,完全不需要操作SparkContext:
%%pyspark spark.conf.set("spark.sql.legacy.parquet.int96RebaseModeInRead", "CORRECTED") spark.conf.set("spark.sql.legacy.parquet.int96RebaseModeInWrite", "CORRECTED") spark.conf.set("spark.sql.legacy.parquet.datetimeRebaseModeInRead", "CORRECTED") spark.conf.set("spark.sql.legacy.parquet.datetimeRebaseModeInWrite", "CORRECTED")
补充注意事项
- 所有托管类Spark Notebook环境(Synapse、Databricks等)都不支持手动停止重建SparkContext,上下文生命周期由平台统一管控,手动干预必然报错。
- 如果配置完
CORRECTED模式后仍存在日期偏移问题,可以将参数值替换为LEGACY试下:CORRECTED模式使用Proleptic Gregorian日历处理1900年前日期,LEGACY模式使用混合日历兼容旧版Spark/Hive写入的历史Parquet文件,根据源文件的实际生成版本选择即可。
内容的提问来源于stack exchange,提问作者DaarioNaharis
相关产品推荐
相关产品推荐

