如何通过ADF仅在ActualTime等于Timestamp时复制Azure表存储数据?
核心思路
要实现仅当Table1的ActualTime与Table2的TimeStamp值相等时复制数据,可通过两种落地方式:一是用查找活动+筛选活动精准定位匹配行后复制;二是直接在复制活动的源端配置筛选查询,一步完成条件匹配与复制。以下是具体实现步骤:
方案一:Lookup+Filter+Copy组合实现精准匹配
1. 配置Azure表存储链接服务
先在ADF中创建两个链接服务,分别关联Table1和Table2所在的Azure存储账户,确保ADF拥有访问这两个表的权限。
2. 用Lookup活动获取Table2的匹配基准数据
添加Lookup活动,数据源选择Table2,设置查询语句提取用于匹配的核心字段:
PartitionKey, RowKey, TimeStamp FROM Table2
该活动会返回Table2中所有行的主键与时间戳数据,作为后续匹配的基准。
3. 用Filter活动筛选Table1的符合条件行
再添加一个Lookup活动获取Table1的全量数据(或先通过PartitionKey缩小范围),接着添加Filter活动,设置筛选条件为:@equals(item().ActualTime, activity('Lookup_Table2').output.value[0].TimeStamp)
如果Table2有多行需要匹配,可嵌套ForEach活动遍历处理每一条基准数据。
4. 执行复制活动
将Filter活动输出的符合条件数据集作为复制活动的源,目标设置为Table2,按需配置写入行为(追加/覆盖等),运行管道即可完成复制。
方案二:直接在复制活动源端配置筛选查询
如果仅需复制Table1中与Table2时间戳匹配的行,可直接在复制活动的源端通过查询语句实现筛选:
1. 配置复制活动源端查询
在复制活动的源设置中选择Table1,在查询字段输入OData格式的筛选语句,示例:
$filter=ActualTime eq (select top 1 TimeStamp from Table2 where PartitionKey eq '1234' and RowKey eq '1111')
若需批量匹配所有符合条件的行,可结合ADF表达式动态拼接查询条件,或通过PartitionKey先分区缩小查询范围。
2. 配置复制活动目标
目标选择Table2,设置合适的写入规则后,运行管道即可完成带条件的复制。
关键注意事项
- 确保两个表的时间字段格式完全一致(如统一为ISO 8601格式),避免因格式差异导致匹配失败。
- 数据量较大时,优先通过
PartitionKey分区筛选,减少查询范围以提升性能。 - 若需定时执行,可为管道添加触发器设置执行频率。
内容的提问来源于stack exchange,提问作者Jen

