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