2012-05-19 23 views
19

Irgendwelche Ideen, wie ein Element/Datensatz zufällig aus einem DynamoDB Tisch holen? Ich glaube nicht, dass dies in der API vorgesehen ist.AWS DynamoDB - Wählen Sie einen Datensatz/Artikel zufällig aus?

Ich dachte über die Pflege einer Tabelle von NumericId | MyOtherKey ("NumericIdTable") und dann eine Zufallszahl zwischen 0 und die Gesamtzahl der Datensätze, die ich habe, dann erhalten dieses Element von NumericIdTable, aber es wird nicht funktionieren in der auf lange Sicht.

Gedanken/Ideen willkommen.

Antwort

20

Ein Ansatz kam ich mit ein zufälliges Element aus einer DynamoDB Tabelle zu holen:

  1. Generieren eines Zufalls RangeKey über alle möglichen RangeKeys in Ihrer Tabelle
  2. Abfrage der Tabelle mit diesem RangeKey und der RangeKeyCondition GreaterThan und ein Limit von 1

zum Beispiel, wenn Sie einen UUID als Identifier verwenden für Ihre RangeKey Sie Ihre Zufallsgenerator wie folgt

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

So erhalten Sie einen zufälligen Artikel und verbrauchen nur 1 Lesekapazität.

Es besteht die Möglichkeit, die erste Abfrage nach einer Zufallsvariablen zu verpassen, indem eine kleinere UUID als die kleinste in der Tabelle verwendete Abfrage generiert wird. Diese Chance wird durch die Skalierung der Tabelle reduziert und Sie können problemlos eine weitere Anfrage mit dem SmallerThan-Vergleich auf demselben Zufallsschlüssel senden, der dann einen Treffer für ein zufälliges Objekt gewährleistet.


Wenn Ihr Tabledesign nicht randomizable RangeKeys ermöglicht es Ihnen, Ihren Ansatz folgen können und eine separate RandomItem Tabelle und speichern Sie die ID unter einem randomizable RangeKey erstellen. Eine mögliche Tabellenstruktur hierfür wäre

*RandomItemTable 
    TableName - HashKey 
    UUID - Rangekey 
    ItemId 

Denken Sie daran, für diesen Ansatz müssen Sie die Redundanz zwischen der ursprünglichen Tabelle und der Randomisierungstabelle verwalten.

+2

Danke für dieses nenTi - ich werde mir das anschauen. Ich muss zugeben, dass ich nicht über dachte einen GT Vergleichsoperator auf einer UUID mit - nette Idee :) – ben

+2

DynamoDB Abfrage muss eine Hash-Schlüssel angeben. Die obige Antwort funktioniert, wenn Sie eine zufällige Zeile für einen bestimmten Hash-Schlüssel erhalten möchten. wenn Sie eine ‚globale‘ Zufallsgenerator erhalten wollen, dann wird es nicht :( –

3

würde die naive Weise 1) seinen Tisch Aufruf verwenden beschreiben N (die Gesamtzahl der Zeilen) in dieser Tabelle 2) Wählen einer Zufallszahl i zwischen 1 und N 3) Scan zu erhalten. Stoppen Sie, bis Sie gesehen haben, ich Reihen

Ich denke über eine bessere Möglichkeit, dies zu tun. Ich werde aktualisieren, wenn ich eine gute Antwort habe.

12

Wenn Sie GUID als Hash-Schlüssel für die Tabelle verwenden, können Sie etwas tun:

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); 

Dies gibt Ihnen einen zufälligen Datensatz jedes Mal, da es eine zufällige GUID als lastKeyEvaluated erzeugt .

+2

So arbeiten, indem sie die Grenze auf 1 setzen, werden Sie nur ein Element bekommen. aber wie ExclusiveStartKey zu einem zufälligen UUID nicht einstellen, der nicht existiert noch geben Sie eine andere zufällige Reihe ??Muss diese generierte UUID nicht schon in der Tabelle existieren? Und durch seine Einzigartigkeit wird das nie passieren –

+0

Die UUID muss nicht in der Tabelle vorhanden sein. Für einen gegebenen Schlüssel weiß DynamoDB, wo es "existieren" sollte, falls dies der Fall ist. Wenn Sie einen zufälligen auswählen, beginnt DynamoDB an dieser Position und wechselt zum nächsten Element und gibt es zurück. Es ist ähnlich, ein zufälliges Haus auf einer Straße zu finden: Wähle eine Hausnummer, gehe dahin, wo diese Hausnummer sein soll, und gehe dann die Straße hinauf, bis du ein Haus findest. – Trenton

+0

Der Wert für YOUR_HASH_KEY kann auch auf die Auswahl von 2048 zufälligen Bits verallgemeinert werden, die wie eine Zeichenfolge behandelt werden und diese als Startpunkt verwenden. Sehen Sie https://StackOverflow.com/questions/5351277/, wie Sie das in Java machen. – Trenton

Verwandte Themen