2012-05-19 15 views
19

Qualche idea su come scegliere un oggetto/registrazione casualmente da un tavolo DynamoDB? Non credo che ci siano disposizioni per questo nell'API.AWS DynamoDB - Scegli un record/oggetto in modo casuale?

Ho pensato di mantenere una tabella di NumericId | MyOtherKey ("NumericIdTable") e quindi di generare un numero casuale compreso tra 0 e il numero totale di record che ho, quindi ottenere quell'elemento da NumericIdTable ma non funzionerà nel lunga corsa.

Pensieri/idee benvenuto.

risposta

20

Un approccio che si avvicinò con quello di scegliere un elemento casuale da una tabella DynamoDB:

  1. generare un RangeKey casuale su tutte le possibili RangeKeys nell'Elenco
  2. interrogare la tabella con questo RangeKey e il RangeKeyCondition GreaterThan e un limite di 1

per esempio, se si utilizza un UUID come identificativo per la vostra RangeKey si potrebbe ottenere il vostro articolo a caso come la seguente

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

In questo modo si ottiene un articolo casuale e si consuma solo 1 capacità di lettura.

C'è una possibilità di perdere la prima query per una variabile casuale generando un UUID più piccolo rispetto a quello più piccolo utilizzato nella tabella. Questa possibilità si ridimensiona con il ridimensionamento della tabella e puoi facilmente inviare un'altra richiesta utilizzando il Confronto SmallerThan sulla stessa chiave casuale, che garantisce un colpo per un oggetto casuale.


Se il Tabledesign non consente RangeKeys randomizable si potrebbe seguire il vostro approccio e creare una tabella RandomItem separato e memorizzare l'ID sotto un RangeKey randomizable. Una possibile struttura della tabella per questo sarebbe

*RandomItemTable 
    TableName - HashKey 
    UUID - Rangekey 
    ItemId 

tenere a mente, per questo approccio è necessario gestire la ridondanza tra la tabella originale e la tabella di randomizzazione.

+2

Grazie per questo nenTi - cercherò di implementarlo. Devo ammettere che non ho pensato di utilizzare un operatore di confronto GT su un UUID - bella idea :) – ben

+2

La query DynamoDB deve specificare una chiave hash. la risposta sopra funzionerà se si desidera ottenere una riga casuale per una chiave hash specifica. se vuoi ottenere un oggetto casuale "globale", allora non funzionerà :( –

3

Il modo più semplice sarebbe 1) usare descrivere chiamata tabella per ottenere N (il numero totale di righe) in questa tabella 2) selezionare un numero casuale i compreso tra 1 e 3 ) scansione N. smetti di vedere le righe

Sto pensando a un modo migliore per farlo. Aggiornerò quando avrò una buona risposta.

12

Se stai usando GUID come chiave hash per la tavola, si può fare qualcosa di simile:

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

questo vi darà un record a caso ogni volta dal momento che genera un GUID casuale come il lastKeyEvaluated .

+2

Quindi impostando il limite su 1, riceverai solo un elemento, ma come impostare ExclusiveStartKey su un UUID casuale che non esiste ancora ti do un'altra riga a caso ??Questo UUID generato non deve esistere già nella tabella? E per la sua unicità, non succederà mai –

+0

L'UUID non ha bisogno di esistere nella tabella. Per una data chiave, DynamoDB sa dove "dovrebbe" esistere, se così fosse. Quando ne scegli uno casuale, DynamoDB inizia in quella posizione e passa all'elemento successivo e lo restituisce. È simile alla ricerca di una casa a caso in una strada: scegli un numero civico, vai dove dovrebbe essere quel numero civico, quindi vai su per la strada fino a trovare una casa reale. – Trenton

+0

Inoltre, il valore di YOUR_HASH_KEY può essere generalizzato alla scelta di 2048 bit casuali, trattandoli come una stringa e utilizzandoli come punto di partenza. Vedi https://stackoverflow.com/questions/5351277/ per come farlo in Java. – Trenton

Problemi correlati