Azure Data Factory复制管道:动态获取今日到达的带昨日日期的文件
在Azure Data Factory中动态获取带昨日日期的文件并复制到Blob
嗨,我来帮你搞定这个ADF里动态定位昨日日期文件的问题!根据你描述的场景——当日收到带昨日日期的TXT文件,要自动复制到Blob,我给你梳理几个关键步骤,都是实际项目里验证过的:
1. 精准生成昨日日期字符串(匹配文件名格式)
首先得生成和文件名完全一致的昨日日期格式(比如你例子里的2018-02-11),这里要注意时区问题,别踩坑:
- 如果你的系统用UTC时间:直接用这个表达式生成昨日日期:
@adddays(utcnow(), -1, 'yyyy-MM-dd') - 如果是中国标准时间(CST),一定要先转换时区再计算,不然UTC凌晨时段本地还是前一天,会导致日期错误:
@adddays(convertTimeZone(utcnow(), 'UTC', 'China Standard Time'), -1, 'yyyy-MM-dd')
2. 拼接出完整的动态文件名
把固定的文件名前缀和生成的日期拼起来,就能得到目标文件的全名了:
@concat('filename_', adddays(convertTimeZone(utcnow(), 'UTC', 'China Standard Time'), -1, 'yyyy-MM-dd'), '.txt')
记得把filename_替换成你实际的文件名前缀哦。
3. 配置复制活动的源数据集
在你的Blob到Blob复制活动里,找到源数据集的配置项:
- 选择“文件”作为源类型(别选文件夹,不然会复制整个文件夹的内容)
- 在“文件名”字段,点击「添加动态内容」,粘贴上面的拼接表达式
这样复制活动运行时,就会自动定位到那个带昨日日期的TXT文件。
4. 结合每日触发计划优化(更可靠)
如果你的管道是每日自动触发的,建议用触发的计划时间来计算日期,比utcnow()靠谱多了——毕竟如果管道运行延迟,utcnow()会变成当前实际时间,可能导致日期偏差:
@adddays(trigger().scheduledTime, -1, 'yyyy-MM-dd')
把这个日期拼到文件名里,就能保证每次触发都精准获取前一天的文件。
关于你提到的“昨日数据切片已运行”的补充
如果你的管道是基于时间切片的(比如做增量复制的切片),那得让切片时间和文件名日期对应上。比如2018-03-12的切片要处理2018-03-11的文件,这时候用切片的windowStart来计算:
@formatDateTime(adddays(pipeline().parameters.windowStart, -1), 'yyyy-MM-dd')
这样就能得到切片对应的昨日日期,完美匹配文件名。
内容的提问来源于stack exchange,提问作者Amedo
相关产品推荐
相关产品推荐

