求助:ADF管道无法读取Parquet文件中的DECIMAL(36,0)值
解决方案:ADF/Synapse复制超大Decimal数值失败问题
问题核心原因
ADF/Synapse复制活动的Parquet解析器与SQL Serverless的解析逻辑存在差异:前者默认Decimal精度/刻度配置无法容纳超大数值,自动类型转换时触发溢出;后者对Decimal的解析范围更宽松,因此直接查询无问题。
具体解决方案
方案1:修改SQL Serverless源查询,强制转字符串传递
在SQL Serverless查询中,将超大数值列显式转换为字符串类型,绕开ADF的自动类型转换溢出:SELECT CAST(gwcbi___seqval AS VARCHAR(60)) AS gwcbi___seqval, -- 其他列 col1, col2 FROM OPENROWSET( BULK 'your-parquet-path', FORMAT = 'PARQUET' ) AS [result]复制活动映射时,将该字符串列对应到目标SQL托管实例的
VARCHAR(MAX)或足够精度的DECIMAL(38,0)列(若数值未超38位)。方案2:自定义Parquet数据集的类型映射
若直接使用Parquet文件作为源,在ADF数据集的高级设置中强制指定列类型为字符串:- 编辑Parquet数据集,切换到「高级」选项卡
- 点击「添加类型映射」,列名填
gwcbi___seqval,类型选择String - 保存后重新运行复制活动,ADF会以字符串格式读取该列,避免Decimal转换错误。
方案3:调整目标SQL列类型适配超大数值
SQL Server的DECIMAL类型最大精度为38位,若你的数值超过38位,必须将目标列改为VARCHAR(MAX)或NVARCHAR(MAX);若未超38位,确保目标列设置为DECIMAL(38,0)(或对应刻度),避免因精度不足导致写入失败。方案4:用数据流动(Data Flow)替代复制活动
数据流动的类型处理逻辑更灵活,可在转换阶段处理超大数值:- 源节点选择Parquet或SQL Serverless
- 添加「派生列」转换,将
gwcbi___seqval转换为字符串(toString(gwcbi___seqval))或调整Decimal精度 - 目标节点写入SQL托管实例,对应列类型匹配即可。
验证步骤
修改配置后,先测试复制小批量包含超大数值的数据,确认无报错后再执行全量复制任务。
内容的提问来源于stack exchange,提问作者Jason Campbell
相关产品推荐
相关产品推荐

