web-dev-qa-db-ja.com

AWS DynamoDB-レコード/アイテムをランダムに選択しますか?

DynamoDBテーブルからランダムにアイテム/レコードを選択する方法はありますか? APIにこれに関する規定はないと思います。

NumericId | MyOtherKey( "NumericIdTable")のテーブルを維持し、0からレコードの総数までの乱数を生成し、NumericIdTableからそのアイテムを取得することを考えましたが、長期的には機能しません。

考え/アイデアを歓迎します。

38
ben

DynamoDBテーブルからランダムなアイテムを選択するために私が思いついた1つのアプローチ:

  1. テーブル内のすべての可能なRangeKeyに対してランダムなRangeKeyを生成します
  2. このRangeKeyとRangeKeyConditionGreaterThanおよび制限1を使用してテーブルをクエリします

たとえば、RangeKeyの識別子としてUUIDを使用する場合、次のようなランダムなアイテムを取得できます。

RandomRangeKey = new UUID
RandomItem = Query( "HashKeyValue": "KeyOfRandomItems",
                    "RangeKeyCondition": { "AttributeValueList":
                                "RandomRangeKey",
                                "ComparisonOperator":"GT"}, 
                    "Limit": 1 )

このようにして、ランダムなアイテムを取得し、読み取り容量を1つだけ消費します。

テーブルで使用されている最小のUUIDよりも小さいUUIDを生成すると、確率変数の最初のクエリを見逃す可能性があります。このチャンスはテーブルのスケールアップに伴ってスケールダウンし、同じランダムキーでSmallerThan Comparisonを使用して別のリクエストを簡単に送信できます。これにより、ランダムアイテムが確実にヒットします。


Tabledesignでランダム化可能なRangeKeyが許可されていない場合は、アプローチに従って別のRandomItemテーブルを作成し、ランダム化可能なRangeKeyの下にIDを格納できます。このための可能なテーブル構造は次のようになります

*RandomItemTable
   TableName - HashKey
   UUID - Rangekey
   ItemId

このアプローチでは、元のテーブルとランダム化テーブルの間の冗長性を管理する必要があることに注意してください。

31
nenTi

テーブルのハッシュキーとしてGUIDを使用している場合は、次のように実行できます。

var client = new AmazonDynamoDBClient();

var lastKeyEvaluated = new Dictionary<string, AttributeValue>() 
{ 
    { "YOUR_HASH_KEY", new AttributeValue(Guid.NewGuid().ToString()) } 
};

var request = new ScanRequest()
{
    TableName = YOUR_TABLE_NAME,
    ExclusiveStartKey = lastKeyEvaluated,
    Limit = 1
};
var response = client.Scan(request);

これにより、lastKeyEvaluatedとしてランダムなGUIDが生成されるため、毎回ランダムなレコードが得られます。

24
cmilam

単純な方法は、1)describe table callを使用してこのテーブルのN(行の総数)を取得する2)1からNの間の乱数iを選択する3)スキャンすることです。 i行が表示されるまで停止します

私はこれを行うためのより良い方法を考えています。良い答えがありましたら更新します。

4
Erben Mo

これを行う簡単で効果的な方法の1つ:

  1. テーブル内のすべてのアイテムを取得します。 DynamoDBには1MBのデータしかフェッチできないという制限があるため、この操作ではProjectionExpressionを使用してのみプライマリパーティションキーを取得します。
  2. 上記の結果から、アイテムの総数が得られます。ここで、0からアイテム数までの乱数を生成するだけです。この乱数をnと呼びましょう。
  3. 1の結果から、そのランダムなアイテムのプライマリパーティションキー値となるn-番目のアイテムを取得します。
  4. 計算したランダムアイテムのプライマリパーティションキー値を使用して別のDynamoDBクエリを実行し、必要なすべての列値を取得します。
0
Amit