Azure Synapse SQL池无法访问含decimal类型列的Spark表问题咨询
问题根因
Spark 2.4.2版本存在Decimal类型写表的已知兼容缺陷,结合Azure Synapse环境特性,触发静默失败的常见原因如下:
- 你定义的
decimal(19,4)精度超过Synapse默认Spark表字段精度阈值,元数据校验不通过,但Spark 2.4.x版本对该场景下默认开启静默失败机制,不会抛出异常 - overwrite模式下若目标表原有schema与待写数据的decimal精度不匹配,2.4版本的schema校验逻辑针对decimal类型存在bug,会直接终止写入无报错
- Azure Synapse内置Hive Metastore对Spark 2.4的decimal类型默认开启精度自动降级逻辑,类型不兼容时写入直接被拦截无返回
解决方案
- 写入前先调整Spark配置,兼容decimal类型写入规则:
# 开启Parquet兼容旧版格式,适配decimal类型存储 spark.conf.set("spark.sql.parquet.writeLegacyFormat", "true") # 关闭精度自动丢失时的静默处理,触发异常便于定位问题 spark.conf.set("spark.sql.decimalOperations.allowPrecisionLoss", "false")
调整配置后再执行原写入逻辑即可。
2. 若调整后仍失败可显式指定表字段类型写入:
df2.write \ .mode("overwrite") \ .option("createTableColumnTypes", "value decimal(19,4)") \ .saveAsTable("DBNAME.TABLENAME")
- 也可以提前手动建表指定schema再写入,完全规避自动推断问题:
spark.sql("DROP TABLE IF EXISTS DBNAME.TABLENAME") spark.sql(""" CREATE TABLE DBNAME.TABLENAME ( value decimal(19,4) ) """) df2.write.mode("append").saveAsTable("DBNAME.TABLENAME")
内容的提问来源于stack exchange,提问作者VJ D
相关产品推荐
相关产品推荐

