2012-05-19 37 views
19

任何想法如何從DynamoDB表中隨機選取項目/記錄?我不相信在API中有這方面的規定。AWS DynamoDB - 隨機選擇一個記錄/項目?

我想過維護一個NumericId | MyOtherKey(「NumericIdTable」)表,然後生成一個介於0和我擁有的記錄總數之間的隨機數,然後從NumericIdTable獲取該項,但它不會在長跑。

想法/想法歡迎。

回答

20

一種方法,我想出了接從DynamoDB表的隨機項目:

  1. 生成所有可能的RangeKeys隨機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 Comparison輕鬆發送另一個請求,從而確保隨機項目的命中。


如果您Tabledesign不允許隨機數RangeKeys你可以按照你的方法,並創建一個單獨的RandomItem表和ID存儲可隨機數RangeKey下。對於這方面的一個可能的表結構將是

*RandomItemTable 
    TableName - HashKey 
    UUID - Rangekey 
    ItemId 

請記住,對於這種方法,你需要管理原始表和隨機表之間的冗餘。

+2

感謝這個nenTi - 我會看看這個實現。我必須承認,我沒有考慮在UUID上使用GT比較運算符 - 好主意:) – ben

+2

DynamoDB查詢需要指定散列鍵。如果你想獲得一個特定的散列鍵的隨機行,上面的答案將工作。如果你想得到一個'全球'的隨機項目,那麼它將不會工作:( –

3

用簡單的方式將是 1)使用描述表調用此表 2以獲得N(行的總數))選擇一個隨機數i 1和N 3)掃描之間。停止,直到你看到我行

我想到一個更好的方式來做到這一點。當我有一個很好的答案時,我會更新。

12

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

所以通過設置限制爲1,你只會得到一個項目,但如何設置ExclusiveStartKey到一個不存在的隨機UUID但給你另一個隨機行?生成的UUID是否必須已經存在於表中?並且由於其獨特性,這永遠不會發生 –

+0

UUID不需要存在於表中。對於給定的密鑰,DynamoDB知道它應該存在的位置,如果存在的話。當您隨機選擇一個時,DynamoDB將從該位置開始,然後移至下一個項目並返回。這類似於在街上找到隨機房屋:選擇一個房屋號碼,前往該房屋號碼的位置,然後沿着街道向上移動,直到找到一棟實際的房屋。 – Trenton

+0

此外,YOUR_HASH_KEY的值可以概括爲選擇2048個隨機位,將其視爲字符串,並將其用作起點。有關如何在Java中執行此操作,請參閱https://stackoverflow.com/questions/5351277/。 – Trenton