ADF动态复制HANA至ADLS Gen2时保留源Decimal类型的方案求助
针对你要批量复制200个不同Schema的HANA表到ADLS Gen2、保留原始Decimal类型的需求,这里提供两种实用方案,优先推荐数据流动的方式,批量操作更省心:
方案一:数据流动+元数据驱动(推荐)
ADF数据流动会自动读取HANA源表的原始列类型(包括Decimal的精度、小数位),不需要手动配置类型映射,适合批量场景。
操作步骤
创建参数化数据流动
- 新建数据流动,添加两个字符串参数:
schemaName(存储HANA Schema名称)、tableName(存储表名)。 - 添加HANA源数据集,在源设置的表名选项中选择「参数化」,输入表达式
@{schemaName}.@{tableName}来动态指定表。
截图说明:左侧数据流动源配置面板,表名下拉选「参数化」,输入框内显示上述表达式,顶部可见已创建的两个参数。
- 添加ADLS Gen2目标数据集,参数化存储路径(比如
@{schemaName}/@{tableName}.parquet),格式选Parquet(Parquet能完整保留Decimal的精度属性,比CSV更可靠)。
- 新建数据流动,添加两个字符串参数:
搭建元数据驱动管道
- 管道中添加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属性,表达式清晰可见。
- 管道中添加Lookup活动,连接HANA数据源,执行SQL获取所有要复制的表清单:
验证结果
运行管道后,用ADF的「预览数据」功能查看ADLS里的Parquet文件,确认Decimal的精度、小数位和HANA源表完全一致。
方案二:复制活动+动态类型映射(适合必须用复制活动的场景)
如果一定要用复制活动,可以通过Lookup获取列元数据,动态生成类型映射规则,避免手动配置。
操作步骤
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遍历所有表。动态生成类型映射
在复制活动的「类型映射」面板,先点击「导入架构」,然后切换到动态内容,输入以下表达式生成自定义映射:@{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列,生成和源表一致的类型映射规则。
截图说明:复制活动类型映射面板,切换到动态内容后,输入上述表达式,编辑框上方显示验证通过的提示。
批量执行
同样用ForEach活动遍历所有目标表,逐个执行带动态类型映射的复制活动即可。
注意事项
- 目标格式优先选Parquet:CSV是文本格式,Decimal会转成字符串,无法保留精度属性;Parquet是列式存储,能完整保留Decimal的元数据。
- HANA元数据查询可能需要调整:不同HANA版本的系统表可能有差异,比如部分版本用
PUBLIC.TABLES代替SYS.TABLES,根据实际环境修改。 - 先测试再批量:拿1-2个表验证类型正确后,再运行200个表的批量任务。
内容的提问来源于stack exchange,提问作者Azure Developer

