44

任何想法如何从 DynamoDB 表中随机选择项目/记录?我不相信 API 中对此有任何规定。

我考虑过维护一个 NumericId|MyOtherKey ("NumericIdTable") 表,然后生成一个介于 0 和我拥有的记录总数之间的随机数,然后从 NumericIdTable 获取该项目,但从长远来看它不会起作用。

欢迎提出想法/想法。

4

5 回答 5

34

我想出的一种方法是从 DynamoDB 表中选择一个随机项目:

  1. 在表中所有可能的 RangeKey 上生成一个随机 RangeKey
  2. 使用此 RangeKey 和 RangeKeyCondition GreaterThan 以及限制为 1 查询表

例如,如果您使用 UUID 作为 RangeKey 的标识符,您可以获得如下所示的随机项目

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

这样您就可以得到一个随机项目并且只消耗 1 个读取容量。

通过生成比表中使用的最小 UUID 更小的 UUID,有可能错过对随机变量的第一次查询。这个机会随着表的扩大而缩小,您可以使用 SmallerThan 比较在同一个随机键上轻松发送另一个请求,从而确保随机项目的命中。


如果您的 Tabledesign 不允许可随机化的 RangeKey,您可以按照您的方法创建一个单独的 RandomItem 表并将 ID 存储在可随机化的 RangeKey 下。一个可能的表结构是

*RandomItemTable
   TableName - HashKey
   UUID - Rangekey
   ItemId

请记住,对于这种方法,您需要管理原始表和随机表之间的冗余。

于 2012-05-20T23:45:46.077 回答
30

如果您使用 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);

这每次都会给你一个随机记录,因为它会生成一个随机 GUID 作为 lastKeyEvaluated。

于 2014-12-09T21:43:42.700 回答
2

天真的方法是 1)使用描述表调用来获取该表中的 N(总行数) 2)在 1 和 N 之间选择一个随机数 i 3)扫描。停下来,直到你看到 i 行

我正在考虑一种更好的方法来做到这一点。当我有一个好的答案时,我会更新。

于 2014-06-20T03:36:04.477 回答
0

对于某些用例,我会推荐下一种方法:

  1. 创建一个扫描所有 dynamodb 表并将“pk”和“sk”保存到单独文件的脚本。

  2. 将 lambda 层中的所有“pk”和“sk”对保存为本地依赖项(如果使用 nodejs,请搜索“package.json 中的本地依赖项”)。

  3. 在 lambda 中导入本地依赖项并选择一个随机项。

  4. 定期运行脚本以获取本地依赖项中一组令人耳目一新的“pk”和“sk”。

我认为如果您没有非常大的 dynamodb 表并且不需要经常包含新的“pk”和“sk”,这种方法就足够了。

于 2021-11-13T19:33:24.790 回答
0

一种简单有效的方法:

  1. 检索表中的所有项目。由于 DynamoDB 限制只能获取 1MB 的数据,因此在此操作中ProjectionExpression用于检索您的主分区键。
  2. 从上面的结果中,您将获得项目的总数。现在,只需生成一个介于 0 和项目计数之间的随机数。我们称这个随机数为n
  3. 从 1 的结果中,取第n个项目,这将是该随机项目的主分区键值。
  4. 使用您刚刚计算的随机项的主分区键值执行另一个 DynamoDB 查询,以获取所有必要的列值。
于 2019-05-13T06:27:14.500 回答