任何想法如何從DynamoDB表中隨機選取項目/記錄?我不相信在API中有這方面的規定。AWS DynamoDB - 隨機選擇一個記錄/項目?
我想過維護一個NumericId | MyOtherKey(「NumericIdTable」)表,然後生成一個介於0和我擁有的記錄總數之間的隨機數,然後從NumericIdTable獲取該項,但它不會在長跑。
想法/想法歡迎。
任何想法如何從DynamoDB表中隨機選取項目/記錄?我不相信在API中有這方面的規定。AWS DynamoDB - 隨機選擇一個記錄/項目?
我想過維護一個NumericId | MyOtherKey(「NumericIdTable」)表,然後生成一個介於0和我擁有的記錄總數之間的隨機數,然後從NumericIdTable獲取該項,但它不會在長跑。
想法/想法歡迎。
一種方法,我想出了接從DynamoDB表的隨機項目:
例如限價如果使用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)使用描述表調用此表 2以獲得N(行的總數))選擇一個隨機數i 1和N 3)掃描之間。停止,直到你看到我行
我想到一個更好的方式來做到這一點。當我有一個很好的答案時,我會更新。
如果您使用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 。
所以通過設置限制爲1,你只會得到一個項目,但如何設置ExclusiveStartKey到一個不存在的隨機UUID但給你另一個隨機行?生成的UUID是否必須已經存在於表中?並且由於其獨特性,這永遠不會發生 –
UUID不需要存在於表中。對於給定的密鑰,DynamoDB知道它應該存在的位置,如果存在的話。當您隨機選擇一個時,DynamoDB將從該位置開始,然後移至下一個項目並返回。這類似於在街上找到隨機房屋:選擇一個房屋號碼,前往該房屋號碼的位置,然後沿着街道向上移動,直到找到一棟實際的房屋。 – Trenton
此外,YOUR_HASH_KEY的值可以概括爲選擇2048個隨機位,將其視爲字符串,並將其用作起點。有關如何在Java中執行此操作,請參閱https://stackoverflow.com/questions/5351277/。 – Trenton
感謝這個nenTi - 我會看看這個實現。我必須承認,我沒有考慮在UUID上使用GT比較運算符 - 好主意:) – ben
DynamoDB查詢需要指定散列鍵。如果你想獲得一個特定的散列鍵的隨機行,上面的答案將工作。如果你想得到一個'全球'的隨機項目,那麼它將不會工作:( –