You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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数据集的高级设置中强制指定列类型为字符串:

    1. 编辑Parquet数据集,切换到「高级」选项卡
    2. 点击「添加类型映射」,列名填gwcbi___seqval,类型选择String
    3. 保存后重新运行复制活动,ADF会以字符串格式读取该列,避免Decimal转换错误。
  • 方案3:调整目标SQL列类型适配超大数值
    SQL Server的DECIMAL类型最大精度为38位,若你的数值超过38位,必须将目标列改为VARCHAR(MAX)或NVARCHAR(MAX);若未超38位,确保目标列设置为DECIMAL(38,0)(或对应刻度),避免因精度不足导致写入失败。

  • 方案4:用数据流动(Data Flow)替代复制活动
    数据流动的类型处理逻辑更灵活,可在转换阶段处理超大数值:

    1. 源节点选择Parquet或SQL Serverless
    2. 添加「派生列」转换,将gwcbi___seqval转换为字符串(toString(gwcbi___seqval))或调整Decimal精度
    3. 目标节点写入SQL托管实例,对应列类型匹配即可。

验证步骤

修改配置后,先测试复制小批量包含超大数值的数据,确认无报错后再执行全量复制任务。

内容的提问来源于stack exchange,提问作者Jason Campbell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:30:46