AWS DynamoDB - 随机选择记录/项目?

时间:2012-05-19 15:09:19

标签: random amazon-web-services record amazon-dynamodb

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

我考虑过维护一个NumericId | MyOtherKey(“NumericIdTable”)表,然后生成一个介于0和我拥有的记录总数之间的随机数,然后从NumericIdTable中获取该项,但它不能在长时间内工作-run。

欢迎思考/想法。

4 个答案:

答案 0 :(得分:27)

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

  1. 在表
  2. 中为所有可能的RangeKeys生成随机RangeKey
  3. 使用此RangeKey和RangeKeyCondition GreaterThan和限制1查询表
  4. 例如,如果您使用UUID作为RangeKey的标识符,您可以获得随机项,如下所示

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

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

    通过生成比表中使用的最小UUID更小的UUID,有可能错过随机变量的第一个查询。这个机会随着桌子放大而缩小,您可以使用相同随机密钥的SmallerThan Comparison轻松发送另一个请求,然后确保随机项目的命中。


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

    *RandomItemTable
       TableName - HashKey
       UUID - Rangekey
       ItemId
    

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

答案 1 :(得分:16)

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

答案 2 :(得分:4)

天真的方式 1)使用describe table调用获取此表中的N(总行数) 2)选择1和N之间的随机数i 3)扫描。停下来,直到你看到我的行

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

答案 3 :(得分:0)

一种简单有效的方法:

  1. 检索表中的所有项目。由于DynamoDB只能提取1MB数据,因此在此操作中,使用ProjectionExpression仅检索 主分区密钥。
  2. 从以上结果中,您将获得项目总数。现在,只需生成一个介于0和项目数之间的随机数。我们将此随机数称为 n
  3. 从1的结果中选择第 n 个项目,该项目将是该随机项目的主分区键值。
  4. 使用刚刚计算出的随机项目的主分区键值执行另一个DynamoDB查询,以获取所有必要的列值。