2012-05-19 12 views
19

¿Alguna idea de cómo elegir un artículo/registro al azar de una tabla de DynamoDB? No creo que haya ninguna disposición para esto en la API.AWS DynamoDB: ¿elige un registro/elemento aleatoriamente?

Pensé en mantener una tabla de NumericId | MyOtherKey ("NumericIdTable") y luego generar un número aleatorio entre 0 y el número total de registros que tengo, y luego obtener ese elemento de NumericIdTable pero no va a funcionar en el largo plazo.

Pensamientos/ideas de bienvenida.

Respuesta

20

Un enfoque que se le ocurrió a escoger un artículo al azar de una tabla DynamoDB:

  1. generar un RangeKey azar en todas las RangeKeys posibles en su tabla
  2. consultar la tabla con este RangeKey y la RangeKeyCondition MayorQue y un límite de 1

por ejemplo, si utiliza un UUID como identificador para su RangeKey usted podría conseguir su artículo al azar como la siguiente

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

De esta forma se obtiene un elemento aleatorio y solo consume 1 capacidad de lectura.

Existe la posibilidad de perder la primera consulta de una variable aleatoria al generar un UUID más pequeño que el más pequeño utilizado en la tabla. Esta posibilidad se reduce con la escala de la tabla y puede enviar fácilmente otra solicitud utilizando la Comparación más pequeña de Than en la misma clave aleatoria, que luego asegura un golpe para un elemento aleatorio.


Si su Tabledesign no permite RangeKeys randomizable que podrían seguir su enfoque y crear una tabla RandomItem independiente y almacenar el ID bajo un RangeKey randomizable. Una posible estructura de la tabla para esto sería

*RandomItemTable 
    TableName - HashKey 
    UUID - Rangekey 
    ItemId 

tener en cuenta, para este enfoque que necesita para administrar la redundancia entre la tabla original y la tabla de asignación al azar.

+2

Gracias por este nenTi - Voy a echar un vistazo a la implementación de esto. Debo admitir que no pensé en utilizar un operador de comparación GT en un UUID - buena idea :) – ben

+2

La consulta DynamoDB necesita especificar una clave hash. la respuesta anterior funcionará si desea obtener una fila aleatoria para una clave hash específica. si desea obtener un elemento aleatorio 'global', entonces no funcionará :( –

3

La forma ingenua sería 1) el uso de describir llamada mesa para conseguir N (el número total de filas) en esta tabla 2) seleccionar un número aleatorio i entre 1 y N 3) de exploración. hasta que haya visto i filas

Estoy pensando en una mejor manera de hacerlo. Actualizaré cuando tenga una buena respuesta.

12

Si está utilizando GUID como clave Hash de la tabla, se puede hacer algo como esto:

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

Esto le dará un registro aleatorio cada vez ya que genera un GUID aleatorio como lastKeyEvaluated .

+2

Así que estableciendo el límite en 1, solo obtendrá un elemento, pero ¿cómo establecer ExclusiveStartKey en un UUID aleatorio que no existe? aún te da otra fila al azar?¿Eso no generó UUID tiene que existir ya en la tabla? Y por su singularidad, eso nunca sucederá –

+0

El UUID no necesita existir en la tabla. Para una clave determinada, DynamoDB sabe dónde debería "existir", si es así. Cuando eliges uno aleatorio, DynamoDB comienza en esa ubicación, pasa al siguiente elemento y lo devuelve. Es similar a encontrar una casa al azar en una calle: elija un número de casa, vaya a donde debe estar el número de esa casa, luego muévase por la calle hasta que encuentre una casa real. – Trenton

+0

Además, el valor de YOUR_HASH_KEY se puede generalizar para elegir 2048 bits aleatorios, tratando eso como una cadena, y usándolo como punto de partida. Consulte https://stackoverflow.com/questions/5351277/ para saber cómo hacerlo en Java. – Trenton

Cuestiones relacionadas