首页 文章

Azure存储表/事务和重复值

提问于
浏览
3

我需要将一些数据批量插入到azure存储表中 . 根据需要,所有实体共享相同的分区键 .

但事实是某些实体(PK RK组合)可能已经存在于目标表中 .

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

整件事会失败吗?

有没有办法防止这种情况失败而没有逐个实体检查?

谢谢 . 新年快乐!

3 回答

  • 2

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

  • 4

    使用SDK 1.8我尝试使用 InsertOrReplace 以及 InsertOrMerge . 我也试过设置 ETag = "*" . 当我尝试执行包含重复实体(PartitionKey / RowKey)的批处理操作时,每种方法都返回以下错误:

    操作的意外响应代码:0 HResult:-2146233088

    挖掘深入后,核心错误是:

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

    符合thisan entity can appear only once in the transaction, and only one operation may be performed against it.

    我们的解决方案是记住批处理事务中的前一个RowKeys并适当地处理重复项,以便我们为批处理事务每个实体仅添加一个操作 . 在我们的例子中,可以安全地省略批处理事务中的重复项 .

  • 1

    不幸的是,您的批次将以原子方式成功或失败 . 对于那些失败的操作,没有办法忽略错误 .

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

    Proposed Approach To Handle

    把你失败的批次分成两半;因此,如果你有一批100次操作,你最终会进行两批50次操作 . 执行这两个批次 . 继续拆分每个失败的批次并删除已经超过的批次 . 您可以通过将整个数据集建模为单个“批处理”并且具有maxbatchsize = 100然后拆分的规则,将其写为合理有效且可并行化的算法 . 每批可以独立于其他批次执行;因为你只是忽略重复,所以首先插入重叠行的哪个副本无关紧要 .

    其他人可能会喜欢插话,但是,我认为这会为您提供最有效的方式来插入您的数据而无需重复 .

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

相关问题