You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Data Factory中清空CosmosDB(SQL)表

Azure Data Factory 清空Cosmos DB(SQL API)表的最优实现方案

你之前使用数据流的方案报错原因是:不选取任何字段时,数据流输出的结构与Cosmos DB表要求必须包含id等必要字段的结构不匹配,触发了类型转换错误,该方案本身不可行。
针对你的每日跑批清空表的场景,最优实现方案如下:

最优方案:调用Cosmos DB服务端存储过程批量删除(全量级数据通用,性能最佳)

该方案直接在Cosmos DB服务端执行删除逻辑,无需将数据拉取到ADF侧,网络消耗和执行效率都是最高的,适配生产环境每日调度需求,步骤如下:

  • 第一步:在目标Cosmos DB的对应容器中创建全量删除存储过程,代码示例:
// 存储过程名称:truncateContainer
function truncateContainer() {
    var collection = getContext().getCollection();
    var collectionLink = collection.getSelfLink();
    var response = getContext().getResponse();
    var responseBody = {
        deleted: 0,
        continuation: true
    };

    function tryDelete(continuation) {
        var requestOptions = { continuation: continuation };
        var isAccepted = collection.queryDocuments(
            collectionLink,
            "SELECT * FROM root r",
            requestOptions,
            function(err, feed, responseOptions) {
                if (err) throw err;

                if (feed.length > 0) {
                    var deletedCount = 0;
                    feed.forEach(function(doc) {
                        var isAcceptedDel = collection.deleteDocument(
                            doc._self,
                            {},
                            function(err, res) {
                                if (err) throw err;
                                deletedCount++;
                                responseBody.deleted++;
                                if (deletedCount === feed.length) {
                                    tryDelete(responseOptions.continuation);
                                }
                            }
                        );
                        if (!isAcceptedDel) {
                            response.setBody(responseBody);
                        }
                    });
                } else if (responseOptions.continuation) {
                    tryDelete(responseOptions.continuation);
                } else {
                    responseBody.continuation = false;
                    response.setBody(responseBody);
                }
            }
        );
        if (!isAccepted) {
            response.setBody(responseBody);
        }
    }
    tryDelete();
}
  • 第二步:在ADF流水线中添加Cosmos DB执行存储过程活动,调用上述truncateContainer存储过程即可完成全表清空。如果数据量极大单次执行超时,可增加循环逻辑判断返回的continuation参数,直到返回false即删除完成。

备选方案1:Lookup+ForEach逐条删除(仅适用数据量<1000的小表)

如果表数据量极小,可以用轻量实现:

  • 添加Lookup活动,源配置为目标Cosmos表,查询语句写SELECT c.id, c._self FROM c,关闭仅返回首行开关
  • 将Lookup的输出作为ForEach活动的输入,ForEach内部添加Cosmos DB删除活动,传入每条数据的id和分区键完成删除

备选方案2:重建容器(仅适用无需保留容器配置的测试场景)

如果不需要保留容器的索引策略、TTL、RU配置,可以直接调用ARM活动或Azure CLI活动删除原有容器后新建,速度最快但配置丢失风险高,不推荐生产环境使用。

内容的提问来源于stack exchange,提问作者Croga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 05:15:07