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

ben*_*ben 36 random record amazon-web-services amazon-dynamodb

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

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

欢迎思想/想法.

nen*_*nTi 30

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

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

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

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

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

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


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

*RandomItemTable
   TableName - HashKey
   UUID - Rangekey
   ItemId
Run Code Online (Sandbox Code Playgroud)

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

  • 现在已经2019年了。对此有更好的解决方案吗? (4认同)
  • 感谢这个nenTi - 我将看看实现这个.我必须承认我没有考虑在UUID上使用GT比较运算符 - 好主意:) (2认同)
  • DynamoDB查询需要指定哈希键.如果您想获取特定哈希键的随机行,则上述答案将起作用.如果你想获得一个'全球'随机项,那么它将无法正常工作:( (2认同)

cmi*_*lam 21

如果您使用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);
Run Code Online (Sandbox Code Playgroud)

这将为您提供随机记录,因为它生成随机GUID作为lastKeyEvaluated.

  • 表中不需要存在UUID.对于给定的密钥,DynamoDB知道"应该"存在的位置,如果存在的话.当您选择一个随机的,DynamoDB从该位置开始,然后移动到下一个项目并返回它.这类似于在街道上找到一个随意的房子:选择门牌号码,去那个门牌号应该去的地方,然后沿着街道向上移动,直到你找到一个真正的房子. (6认同)
  • 因此,通过将限制设置为1,您将只获得一个项目.但是如何将ExclusiveStartKey设置为一个不存在的随机UUID却给你另一个随机行?这个生成的UUID是否已经存在于表中?凭借其独特性,这种情况永远不会发生 (3认同)