unused provided keys keyconditionexpression expressions expressionattributenames dynamodb random amazon-web-services record amazon-dynamodb

random - provided - expressionattributenames dynamodb



AWS DynamoDB: ¿elige un registro/elemento al azar? (3)

¿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.

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 bienvenidos.


La forma ingenua sería 1) usar describir tabla de llamadas para obtener N (el número total de filas) en esta tabla 2) seleccionar un número aleatorio i entre 1 y N 3) escanear. parar hasta que hayas visto i filas

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


Si está utilizando GUID como su clave Hash para la tabla, 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 todas las veces, ya que genera un GUID aleatorio como último valor evaluado.


Un enfoque que se me ocurrió para elegir un elemento aleatorio de una tabla DynamoDB:

  1. Genera una RangeKey aleatoria sobre todas las RangeKeys posibles en tu Table
  2. Consulta la tabla con este RangeKey y RangeKeyCondition GreaterThan y un límite de 1

Por ejemplo, si utiliza un UUID como identificador para su RangeKey, puede obtener su elemento aleatorio como el siguiente

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

De esta forma, obtienes un elemento aleatorio y solo consumes 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 al azar, puede seguir su enfoque y crear una tabla RandomItem por separado y almacenar la ID bajo una RangeKey aleatoria. Una posible estructura de tabla para esto sería

*RandomItemTable TableName - HashKey UUID - Rangekey ItemId

Tenga en cuenta que, para este enfoque, debe gestionar la redundancia entre la tabla original y la tabla de aleatorización.