我需要将一些数据批量插入到azure存储表中。 根据需要,所有实体共享相同的分区密钥。
但事情是某些实体(PK + RK组合)可能已经存在于目标表中。
我的理解是整个交易在交易过程中成功失败,所以我的问题是如果将这些实体作为交易插入时会发生一些重复会发生什么?
整件事会失败吗?
有没有办法防止这种情况失败而不按实体检查实体?
感谢。 新年快乐!
答案 0 :(得分:4)
您是否看到过新的Upsert行为?这可能是一个很好的例子。如果您只想覆盖现有实体,则可以使用InsertOrReplace实体(或InsertOrMerge操作,如果您这样做)。这将忽略碰撞时的错误并使用合并或替换操作。
答案 1 :(得分:2)
使用SDK 1.8我尝试使用InsertOrReplace
以及InsertOrMerge
。我也试过设置ETag = "*"
。当我尝试执行包含重复实体(PartitionKey / RowKey)的批处理操作时,每种方法都返回以下错误:
操作的意外响应代码:0
HResult:-2146233088
深挖后,核心错误是:
InvalidInput
1:其中一个请求输入无效。
根据this,实体只能在交易中出现一次,并且只能对其执行一次操作。
我们的解决方案是记住批处理事务中的前一个RowKeys并适当地处理重复项,以便我们为批处理事务每个实体仅添加一个操作。在我们的例子中,可以安全地省略批处理事务中的重复项。
答案 2 :(得分:1)
不幸的是,您的批次将以原子方式成功或失败。对于那些失败的操作,没有办法忽略错误。
您可能想要做的是在此处实施一些智能错误处理。您的问题是先验检查重复项是非常昂贵的,因为没有批量GET操作(好的,严格来说有支持;但每个批次只有一个查询)。我最初的想法是,处理这个问题的最有效方法是采用失败的批处理,基本上是二叉树搜索它。
建议的处理方法
取出失败的批次并将其分成两半;因此,如果你有一批100次操作,你最终会进行两批50次操作。执行这两个批次。继续拆分每个失败的批次并删除已经超过的批次。您可以通过将整个数据集建模为单个“批处理”并且具有maxbatchsize = 100然后拆分的规则,将其写为合理有效且可并行化的算法。每批可以独立于其他批次执行;因为你只是忽略了重复,所以首先插入哪个副本行并不重要。
其他人可能会喜欢插话,但是,我认为这会为您提供最有效的方式来插入数据而无需重复。
其他选项是在数据到达Azure表存储之前对数据进行重复数据删除,但是,在评论这是否是更好的方法之前,可能想知道行的总数和相对重复频率。