这是一种使用 ADF 应用动态列名映射的解决方案,这样即使源列名包含不支持的讨厌的空白字符,您仍然可以使用 parquet 格式的复制数据活动。
解决方案涉及三个部分:
- 动态生成映射列名列表。下面的示例演示了如何使用查找活动(以下称为“查找列映射”)对 SQL 数据库表源数据集中的空白进行动态编码。
;with cols as (
select
REPLACE(column_name, (' ', '__wspc__') as new_name,
column_name as old_name
from INFORMATION_SCHEMA.columns
where table_name = '@{pipeline().parameters.SOURCE_TABLE}'
and table_schema = '@{pipeline().parameters.SOURCE_SCHEMA}'
)
select ' |||'+old_name+'||'+new_name+'|' as mapping
from cols;
- 使用表达式将步骤 1 中查找活动中派生的列映射重新打包为复制数据活动模板所期望的 json 语法。您可以将其插入到具有 Array 类型变量的集合变量活动中(以下称为“column_mapping_list”)。
@json(
concat(
'[ ',
join(
split(
join(
split(
join(
split(
join(
xpath(
xml(
json(
concat(
'{\"root_xml_node\": ',
string(activity('lookup column mapping').output),
'}'
)
)
),
'/root_xml_node/value/mapping/text()',
)
','
),
'|||'
),
'{\"source\": { \"name\": \"'
),
'||'
),
'\" },\"sink\": { \"name\": \"'
),
'|'
),
'\" }}'
),
' ]'
)
)
不幸的是,表达式比我们想要的更复杂,因为 xpath 函数需要一个查找活动输出未提供的单个根节点,并且 ADF json 模板的字符串转义对简化这一点提出了一些挑战。
- 最后,在复制数据活动的映射部分使用列映射列表变量作为“动态内容”,表达式如下
@json(
concat(
'{ \"type\": \"TabularTranslator\", \"mappings\":',
string(variables('column_mapping_list')),
'}'
)
)
预期结果:
第 1 步。
'我的 wspccol' -> '|||我的 wspccol||my__wspc__wspcol|'
第 2 步。
'|||我的 wspccol||my__wspc__wspccol|' -> ['{ "source": { "name": "my wspccol" }, "sink": { "name": "my__wspc__wspccol" } }']
第 3 步。
{
"type": "TabularTranslator",
"mappings": [
{
"source": { "name": "my wspccol" },
"sink": { "name": "my__wspc__wspccol" }
}
]
}
另外: