135

DynamoDB で簡単なロギング サービスを作成しています。

user_id ハッシュとタイムスタンプ (Unix エポック int) 範囲をキーとするログ テーブルがあります。

サービスのユーザーがアカウントを終了すると、範囲の値に関係なく、テーブル内のすべてのアイテムを削除する必要があります。

この種の操作を行うための推奨される方法は何ですか (何百万ものアイテムを削除する可能性があることに注意してください)。

私が見る限り、私のオプションは次のとおりです。

A: Scan 操作を実行し、アイテムがなくなるまで、返されたアイテムごとに delete を呼び出します。

B: BatchGet 操作を実行し、アイテムがなくなるまで各アイテムに対してもう一度 delete を呼び出します。

これらは両方とも時間がかかるので、私にはひどいように見えます。

私が理想的にやりたいことは、範囲を指定せずに LogTable.DeleteItem(user_id) を呼び出し、すべてを削除してもらうことです。

4

9 に答える 9

66

私が理想的にやりたいことは、範囲を指定せずに LogTable.DeleteItem(user_id) を呼び出して、すべてを削除してもらうことです。

確かに理解できる要求です。このような高度な操作は、AWS チームによって時間の経過とともに追加される可能性があると想像できます (彼らは、限られた機能セットから最初に開始し、顧客からのフィードバックに基づいて拡張機能を評価するという歴史があります)。少なくともフルスキャン:

  1. ScanではなくQueryを使用して、すべての項目を取得します。これは、使用中のハッシュ/範囲主キーの組み合わせに関係なく機能します。これは、 HashKeyValueRangeKeyConditionがこの API の個別のパラメーターであり、前者はコンポジットのハッシュ コンポーネントの属性値のみを対象とするためです。主キー。.user_id

    • ここでは、通常どおりクエリ API ページングを処理する必要があることに注意してください。ExclusiveStartKeyパラメータ を参照してください。

      以前のクエリを続行するアイテムの主キー。以前のクエリは、そのクエリ操作がクエリを完了する前に中断された場合、この値を LastEvaluatedKey として提供する可能性があります。結果セットのサイズまたは Limit パラメータが原因です。LastEvaluatedKey を新しいクエリ リクエストで返すと、その時点から操作を続行できます。

  2. 返されたすべてのアイテムをループし、通常どおりDeleteItemを促進します

    • 更新: このようなユースケースには、おそらくBatchWriteItemの方が適しています (詳細については以下を参照してください)。

アップデート

ivantで強調されているように、BatchWriteItem操作を使用すると、1 回の API 呼び出しで複数のテーブルにまたがる複数の項目を配置または削除できます [私の強調] :

1 つのアイテムをアップロードするには PutItem API を使用でき、1 つのアイテムを削除するには DeleteItem API を使用できます。ただし、Amazon Elastic MapReduce (EMR) から大量のデータをアップロードしたり、別のデータベースから Amazon DynamoDB にデータを移行したりするなど、大量のデータをアップロードまたは削除する場合、この API は効率的な代替手段を提供します。

これにはまだいくつかの関連する制限があることに注意してください。

  • 1 つの要求での操作の最大数— 合計で最大 25 の put または delete 操作を指定できます。ただし、要求の合計サイズが 1 MB (HTTP ペイロード) を超えることはできません。

  • アトミック操作ではない— BatchWriteItem で指定された個々の操作はアトミックです。ただし、BatchWriteItem は全体として「ベストエフォート」操作であり、アトミック操作ではありません。つまり、BatchWriteItem 要求では、一部の操作が成功する場合と失敗する場合があります。[...]

それにもかかわらず、これは明らかに、目の前のようなユースケースに大きな利益をもたらす可能性があります.

于 2012-02-06T11:30:30.750 に答える
48

DynamoDB のドキュメントによると、テーブル全体を削除できます。

下記参照:

「テーブル全体を削除することは、項目を 1 つずつ削除するよりもはるかに効率的です。これにより、プット操作と同じ数の削除操作を行うため、書き込みスループットが本質的に 2 倍になります」

データのサブセットのみを削除する場合は、月ごと、年ごとなどに個別のテーブルを作成できます。このようにして、「先月」を削除し、残りのデータをそのまま保持できます。

これは、AWS SDK を使用して Java でテーブルを削除する方法です。

DeleteTableRequest deleteTableRequest = new DeleteTableRequest()
  .withTableName(tableName);
DeleteTableResult result = client.deleteTable(deleteTableRequest);
于 2013-04-15T09:51:06.510 に答える
2

dynamo テーブルを切り捨てるオプションはありません。テーブルを削除して、再度作成する必要があります。DynamoDB の料金は ReadCapacityUnits と WriteCapacityUnits に基づいています。BatchWriteItem 関数を使用してすべてのアイテムを削除すると、WriteCapacityUnits が使用されます。そのため、特定のレコードを削除するか、テーブルを削除してからやり直すことをお勧めします。

于 2018-06-06T15:07:19.173 に答える