2011-12-30 98 views
3

我需要将一些数据批量插入到存储表中。 根据需要,所有实体共享相同的分区键。Azure存储表/事务和重复值

虽然有些实体(PK + RK组合)可能已经存在于目标表中。

我的理解是整个交易在交易过程中失败成功,所以我的问题是如果在将这些实体作为交易插入时存在一些重复项会发生什么?

整件事情会失败吗?

有没有什么办法可以防止这种失败,而无需通过实体检查实体?

谢谢。 新年快乐!

回答

4

你见过新的Upsert行为吗?这可能是一个很好的例子。如果您只想覆盖现有实体,则可以使用InsertOrReplace实体(如果您确实关心,则可以使用InsertOrMerge操作)。这将忽略碰撞错误并使用合并或替换操作。

+0

我想upsert可能会这样做,我会试试看。 – IGIT 2012-01-19 21:21:36

1

不幸的是,您的批处理会以原子方式成功或失败。对于那些失败的操作,无法忽略错误。

你可能想要做的是在这里实现一些智能错误处理。你的问题是,先验检查重复将是非常昂贵的,因为没有批量GET操作(好吧,严格来说,有支持;但仅限于每批一个查询)。我最初的想法是,处理这个问题的最有效的方法是采取一个失败的批次,基本上二叉树搜索它。

提出的方法来处理

把你的失败批次和它劈成两半;所以如果你有一批100个操作,你最终会有两批50个操作。执行这两个批次。继续分解每个失败的批次并消除已经成功的批次。通过将整个数据集建模为一个“批处理”并且具有maxbatchsize = 100,然后分裂的规则,您可以将其编写为合理高效且可并行化的算法。每批可以独立执行,因为你只是忽略重复,不管重复插入哪个副本。其他人可能喜欢插入,但是,我认为这会给你最有效的方式插入你的数据忽略重复。

其他选项可能是在数据到达Azure表存储之前重新获取数据,但是在评论这是否是更好的方法之前,可能想知道总行数和相对重复频率。

2

使用SDK 1.8我尝试使用InsertOrReplace以及InsertOrMerge。我也尝试设置ETag = "*"。每种方法返回以下错误时,我试图执行,其中包括一个重复的实体(PartitionKey/RowKey)批量操作:0

HRESULT::-2146233088

操作

意外响应代码

深挖之后,核心错误是:

InvalidInput

1:其中一个请求输入无效。

Accoring到this的实体可以在事务只出现一次,并且可以针对它仅执行一个操作。

我们的解决方案是记住批量事务中的前一个RowKeys,并正确处理重复项,以便为批处理事务添加每个实体只有一个操作。在我们的案例中,从批量交易中省略重复是安全的。