Azure Data Factory从Oracle同步到Parquet时decimal精度丢失问题
解决方案
问题根因
该问题是Azure Data Factory 复制活动Oracle连接器的已知默认行为:Oracle源的decimal类型默认会被硬编码转换为decimal(38,18),复制活动的映射配置中的精度、标度参数对Oracle源不生效,而MSSQL连接器实现了源元数据精度传递逻辑,因此相同配置在MSSQL场景下可正常生效。
可行解决方法
方案1:改用数据流(Data Flow)替代复制活动
在数据流中完成数据同步流程:- 添加Oracle源,完成基础连接配置
- 新增派生列转换,对需要保留精度的decimal字段使用
toDecimal(<字段名>, <目标精度>, <目标标度>)函数显式指定类型,示例:toDecimal(COLUMN, 4, 1) - 在Parquet接收器的配置中开启保留小数精度选项,即可生成符合预期精度的Parquet文件
方案2:保留复制活动,在Oracle查询侧做显式类型转换
不使用直接选择表的源配置,改用自定义查询语句,将decimal字段显式转换为目标精度:SELECT CAST(COLUMN AS NUMBER(4,1)) AS COLUMN FROM 你的表名同时保留你当前配置的映射规则,两者配合即可实现精度保留。
方案3:调整Parquet数据集配置
检查ADLS Parquet数据集的格式设置:- 开启使用原生Parquet小数类型选项,避免ADF默认将decimal转换为二进制类型
- 在数据集的结构定义中,手动为每个decimal字段指定precision和scale属性,不要使用自动推断配置
内容的提问来源于stack exchange,提问作者JVGBI
相关产品推荐
相关产品推荐

