如何在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
相关产品推荐
相关产品推荐

