将Databricks DataFrame加载到Azure Synapse时为何需开启Parquet旧版格式?
为什么需要设置Spark Parquet旧版格式来加载到Azure Synapse?
一、启用旧版Parquet格式的核心原因
本质是Azure Synapse Analytics(尤其是依赖PolyBase读取Parquet的场景)对Parquet Decimal类型的兼容性限制。
根据Spark 3.0.0官方说明:
若设为true,数据将以Spark 1.4及更早版本的方式写入。例如,十进制值将以Apache Parquet的固定长度字节数组格式写入,该格式为Apache Hive、Apache Impala等系统所使用。若设为false,则会使用Parquet的较新版本格式,例如十进制值将以基于整数的格式写入。如果Parquet输出需用于不支持该新版格式的系统,请设为true。
Azure Synapse的PolyBase组件在早期版本中,对Spark新版Parquet的Decimal存储格式(基于整数的编码)支持不佳,无法正确解析这类数据。而Spark旧版格式采用的固定长度字节数组编码,是PolyBase能够识别的标准格式,所以开启这个配置是为了保证Decimal类型数据能被Synapse正常读取,避免出现类型不兼容或数据解析错误。
二、这个设置是强制性的吗?
并不是绝对强制,需结合你的实际场景判断:
- 如果你的DataFrame不包含Decimal类型,或者你的Synapse版本/读取组件(比如Synapse Spark池)已经支持新版Parquet的Decimal格式,完全可以保持默认值
false,无需开启旧版格式。 - 只有当你需要通过PolyBase读取包含Decimal类型的Parquet文件,且Synapse无法正确解析新版格式时,这个设置才是必要的。
三、可行的替代方案
根据你的使用场景,有以下几种替代思路:
- 方案1:保持默认Parquet格式,通过PolyBase读取
前提是确保你的Synapse版本已支持新版Parquet的Decimal格式,或者提前将DataFrame中的Decimal类型转换为兼容类型(比如String,需注意后续处理的精度问题;或者Double,适合对精度要求不高的场景)。 - 方案2:使用Databricks的
COPY INTO命令直接写入Synapse
这是Databricks针对Synapse优化的写入方式,会自动处理格式兼容问题,无需手动设置Parquet旧版格式,且性能更稳定。示例命令如下:COPY INTO synapse_table_name FROM 'abfss://container@storageaccount.dfs.core.windows.net/path/to/parquet' FILEFORMAT = PARQUET - 方案3:用Synapse Spark池读取Databricks生成的Parquet
Synapse Spark池和Databricks基于相同的Spark内核,对新版Parquet格式的兼容性很好,直接读取不会有类型解析问题,适合用Synapse Spark做数据处理的场景。
内容的提问来源于stack exchange,提问作者Atsushi Saijo
相关产品推荐
相关产品推荐

