Azure Data Factory删除活动能否用^运算符实现反向通配筛选?
可行解决方案
方案一:Get Metadata + Filter + Delete 批量处理(推荐)
这是ADF原生的高效替代方案,能解决循环逐个删除的高成本问题,步骤如下:
- 添加Get Metadata活动,关联目标存储路径的数据集,勾选
Child items选项,一次性获取路径下所有文件的元数据(包含文件名、路径等信息)。 - 添加Filter活动,输入源选择Get Metadata的输出:
@activity('Get Metadata 1').output.childItems,筛选条件设置为:
这个表达式会筛选出所有文件名不含@not(contains(item().name, '2024-04-15'))2024-04-15子串的文件。 - 添加Delete活动,同样关联目标存储的数据集,切换到文件列表模式,在「文件路径列表」中输入:
(如果数据集配置的是存储根路径,需要拼接子路径的话,改成@map(activity('Filter 1').output.value, item().name)@map(activity('Filter 1').output.value, concat('/目标子路径/', item().name)))
运行管道后,Delete活动会批量删除筛选后的所有文件,全程仅需3个活动,大幅降低成本。
方案二:Azure Function 辅助处理(适合超大量文件)
如果文件量远超1000个,ADF原生活动处理有压力,可以用Azure Function辅助:
- 用Python或C#编写Function,调用Azure存储SDK(比如Azure.Storage.Blobs),接收存储容器、目标路径、排除子串作为参数。
- 在Function逻辑中遍历指定路径下的所有文件,筛选出不含目标子串的文件并批量删除。
- 在ADF中添加Azure Function活动,传入对应的参数触发执行即可。
为什么之前的通配符方案失效?
ADF数据集的通配符仅支持基础的*(匹配任意多字符)、?(匹配单个字符),以及用^^转义实际文件名中的^字符,不支持正则表达式的负向断言等复杂语法,所以你写的``*^(?!.2024-04-15).`会被判定为非法转义,导致报错。
内容的提问来源于stack exchange,提问作者Francesco Pegoraro
相关产品推荐
相关产品推荐

