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

ADF动态复制HANA至ADLS Gen2时保留源Decimal类型的方案求助

批量保留HANA源Decimal原始类型的ADF实现方案

针对你要批量复制200个不同Schema的HANA表到ADLS Gen2、保留原始Decimal类型的需求,这里提供两种实用方案,优先推荐数据流动的方式,批量操作更省心:

方案一:数据流动+元数据驱动(推荐)

ADF数据流动会自动读取HANA源表的原始列类型(包括Decimal的精度、小数位),不需要手动配置类型映射,适合批量场景。

操作步骤

  1. 创建参数化数据流动

    • 新建数据流动,添加两个字符串参数:schemaName(存储HANA Schema名称)、tableName(存储表名)。
    • 添加HANA源数据集,在源设置的表名选项中选择「参数化」,输入表达式 @{schemaName}.@{tableName} 来动态指定表。

    截图说明:左侧数据流动源配置面板,表名下拉选「参数化」,输入框内显示上述表达式,顶部可见已创建的两个参数。

    • 添加ADLS Gen2目标数据集,参数化存储路径(比如 @{schemaName}/@{tableName}.parquet),格式选Parquet(Parquet能完整保留Decimal的精度属性,比CSV更可靠)。
  2. 搭建元数据驱动管道

    • 管道中添加Lookup活动,连接HANA数据源,执行SQL获取所有要复制的表清单:
      SELECT SCHEMA_NAME, TABLE_NAME 
      FROM SYS.TABLES 
      WHERE SCHEMA_NAME IN ('你的Schema1','你的Schema2',...) -- 替换成你需要的200个Schema,或用其他过滤条件
      
    • 添加ForEach活动,设置Items为 @{activity('Lookup').output.value},并发数根据ADF资源情况调整(比如设为10,避免压垮HANA)。
    • ForEach内部添加Execute Data Flow活动,关联之前的参数化数据流动,给两个参数赋值:
      • schemaName: @{item().SCHEMA_NAME}
      • tableName: @{item().TABLE_NAME}

    截图说明:ForEach内部的Execute Data Flow配置界面,参数列表里的两个参数分别绑定到Lookup返回的item属性,表达式清晰可见。

  3. 验证结果
    运行管道后,用ADF的「预览数据」功能查看ADLS里的Parquet文件,确认Decimal的精度、小数位和HANA源表完全一致。

方案二:复制活动+动态类型映射(适合必须用复制活动的场景)

如果一定要用复制活动,可以通过Lookup获取列元数据,动态生成类型映射规则,避免手动配置。

操作步骤

  1. Lookup获取Decimal列的元数据
    管道中添加Lookup活动,执行HANA元数据查询,拿到目标表的Decimal列信息:

    SELECT 
        COLUMN_NAME,
        LENGTH AS PRECISION,
        SCALE
    FROM SYS.COLUMNS 
    WHERE SCHEMA_NAME = @{pipeline().parameters.schemaName} 
      AND TABLE_NAME = @{pipeline().parameters.tableName}
      AND DATA_TYPE_NAME = 'DECIMAL'
    

    提前在管道定义schemaName和tableName两个参数,后续结合ForEach遍历所有表。

  2. 动态生成类型映射
    在复制活动的「类型映射」面板,先点击「导入架构」,然后切换到动态内容,输入以下表达式生成自定义映射:

    @{createArray(
        foreach(item in activity('Lookup Columns').output.value, 
            createObject(
                "source", createObject("name", item.COLUMN_NAME),
                "sink", createObject(
                    "name", item.COLUMN_NAME,
                    "type", concat("Decimal(", item.PRECISION, ",", item.SCALE, ")")
                )
            )
        )
    )}
    

    这个表达式会自动遍历Lookup到的所有Decimal列,生成和源表一致的类型映射规则。

    截图说明:复制活动类型映射面板,切换到动态内容后,输入上述表达式,编辑框上方显示验证通过的提示。

  3. 批量执行
    同样用ForEach活动遍历所有目标表,逐个执行带动态类型映射的复制活动即可。

注意事项

  • 目标格式优先选Parquet:CSV是文本格式,Decimal会转成字符串,无法保留精度属性;Parquet是列式存储,能完整保留Decimal的元数据。
  • HANA元数据查询可能需要调整:不同HANA版本的系统表可能有差异,比如部分版本用PUBLIC.TABLES代替SYS.TABLES,根据实际环境修改。
  • 先测试再批量:拿1-2个表验证类型正确后,再运行200个表的批量任务。

内容的提问来源于stack exchange,提问作者Azure Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:05:05