你知道如何从DynamoDB表中随机选择一项/记录吗?我不相信API中有任何关于这方面的规定。
我想过维护一个包含NumericId|MyOtherKey (" NumericIdTable ")的表,然后生成一个介于0和我拥有的记录总数之间的随机数,然后从NumericIdTable获取该项目,但从长期来看这是行不通的。
欢迎有想法/想法。
发布于 2012-05-21 07:45:46
我想出了一种从DynamoDB表中随机挑选项目的方法:
例如,如果您使用UUID作为RangeKey的标识符,则可以获得随机项,如下所示
RandomRangeKey = new UUID
RandomItem = Query( "HashKeyValue": "KeyOfRandomItems",
"RangeKeyCondition": { "AttributeValueList":
"RandomRangeKey",
"ComparisonOperator":"GT"},
"Limit": 1 )这样,您将获得一个随机项目,并且只占用1个读取容量。
由于生成的UUID比表中使用的最小UUID小,因此有可能错过对随机变量的第一次查询。这种机会随着表的扩展而缩小,您可以很容易地使用相同随机键上的SmallerThan比较发送另一个请求,从而确保随机项的命中。
如果您的表设计不允许随机化的RangeKeys,您可以按照您的方法创建一个单独的RandomItem表,并将ID存储在一个随机化的RangeKey下。一种可能的表结构是
*RandomItemTable
TableName - HashKey
UUID - Rangekey
ItemId请记住,对于这种方法,您需要管理原始表和随机化表之间的冗余。
发布于 2014-12-10 05:43:43
如果您使用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-06-20 11:36:04
简单方法是1)使用describe table调用来获取该表中的N(总行数) 2)选择1到N之间的随机数i 3)扫描。停止,直到您看到i行
我在想一种更好的方法来做这件事。当我有一个好的答案时,我会更新的。
https://stackoverflow.com/questions/10666364
复制相似问题