2011-12-30 24 views
3

いくつかのデータを空白のストレージテーブルに一括して挿入する必要があります。 必要に応じて、すべてのエンティティが同じパーティションキーを共有します。Azureストレージテーブル/トランザクションと重複値

いくつかのエンティティ(PK + RKの組み合わせ)が既に宛先テーブルに存在する可能性があります。

私が理解しているのは、トランザクション中にトランザクションが失敗したということです。これらのエンティティをトランザクションとして挿入する際に重複があるとどうなりますか?

すべてが失敗しますか?

エンティティごとにエンティティをチェックせずにこれが失敗しないようにする方法はありますか?

ありがとうございました。 新年が幸せです!

答えて

4

新しいUpsertの動作を見たことがありますか?これは良いケースかもしれません。既存のエンティティを上書きするだけの場合は、InsertOrReplaceエンティティ(または気にする場合はInsertOrMerge操作)を使用できます。これにより、衝突時のエラーは無視され、マージまたは置換操作が使用されます。

+0

私はupsertがそれをするかもしれないと思います、私はそれを試してみましょう。 – IGIT

1

残念ながら、バッチは原子的な方法で成功または失敗します。失敗した操作だけでエラーを無視する方法はありません。

ここでは、インテリジェントなエラー処理を実装することをお勧めします。あなたの問題は、バッチGET操作がないため(重複してサポートされていますが、バッチごとに1つのクエリに対してのみ)、重複を事前にチェックするのは非常に高額になります。私の最初の考えは、これに対処する最も効率的な方法は失敗したバッチを取ることであり、基本的にバイナリツリーはそれを検索することである。あなたの失敗したバッチを取り、半分に分割

を処理するために

提案されたアプローチ。 100バッチのバッチがあれば、2バッチの50回のバッチで終了します。これらの2つのバッチを実行します。失敗した各バッチを分割し、成功したバッチを削除します。あなたはおそらく、合理的に効率的かつ並列化可能なアルゴリズムとして、データセット全体を単一のバッチとしてモデリングし、maxbatchsize = 100の両方のルールを持つように分割して分割することで記述できます。各バッチは他のバッチとは独立して実行できます。重複を無視するだけで、重複行のどのコピーが最初に挿入されるかは関係ありません。

他の人がチャイムしているかもしれませんが、これは重複を無視してデータを挿入する最も効果的な方法だと思います。

その他のオプションは、Azureテーブルストレージにヒットする前にデータを重複排除することですが、より良いアプローチであるかどうかをコメントする前に、行の総数と相対的な重複頻度を知りたいと思うでしょう。

2

SDK 1.8を使用して、InsertOrReplaceInsertOrMergeを使ってみました。私もETag = "*"を設定しようとしました。0

HRESULT:-2146233088

動作のため

予期しない応答コード:I重複エンティティ(のPartitionKey /のrowKey)含まれるバッチ操作を実行しようとしたとき、それぞれのアプローチは、次のエラーが返さ

深掘りした後、コアエラーがあった:

InvalidInput

1:要求入力の1つが無効です。

thisにAccoring、エンティティは、トランザクションに1度だけ表示することができ、そして1つの操作のみで、それに対して実行することができます。

バッチトランザクションで以前のRowKeysを覚えておいて、バッチトランザクションのエンティティごとに1つの操作しか追加しないように、重複を適切に処理することでした。私たちの場合、バッチトランザクションから重複を省略することは安全でした。