DynamoDB - Escanear

Las operaciones de exploración leen todos los elementos de la tabla o índices secundarios. Su función predeterminada da como resultado la devolución de todos los atributos de datos de todos los elementos dentro de un índice o tabla. Emplear elProjectionExpression parámetro en el filtrado de atributos.

Cada escaneo devuelve un conjunto de resultados, incluso al no encontrar coincidencias, lo que da como resultado un conjunto vacío. Los escaneos no recuperan más de 1 MB, con la opción de filtrar datos.

Note - Los parámetros y el filtrado de escaneos también se aplican a las consultas.

Tipos de operaciones de escaneo

Filtering- Las operaciones de exploración ofrecen un filtrado preciso a través de expresiones de filtro, que modifican los datos después de las exploraciones o consultas; antes de devolver los resultados. Las expresiones usan operadores de comparación. Su sintaxis se parece a las expresiones de condición, con la excepción de los atributos clave, que las expresiones de filtro no permiten. No puede utilizar una partición o una clave de clasificación en una expresión de filtro.

Note - El límite de 1 MB se aplica antes de cualquier aplicación de filtrado.

Throughput Specifications- Los escaneos consumen rendimiento, sin embargo, el consumo se centra en el tamaño del artículo en lugar de en los datos devueltos. El consumo sigue siendo el mismo si solicita todos los atributos o solo unos pocos, y usar o no una expresión de filtro tampoco afecta el consumo.

Pagination- DynamoDB pagina los resultados provocando la división de los resultados en páginas específicas. El límite de 1 MB se aplica a los resultados devueltos y, cuando lo excede, es necesario realizar otro escaneo para recopilar el resto de los datos. losLastEvaluatedKeyEl valor le permite realizar este análisis posterior. Simplemente aplique el valor alExclusiveStartkey. Cuando elLastEvaluatedKeyvalor se vuelve nulo, la operación ha completado todas las páginas de datos. Sin embargo, un valor no nulo no significa automáticamente que queden más datos. Solo un valor nulo indica estado.

The Limit Parameter- El parámetro de límite gestiona el tamaño del resultado. DynamoDB lo usa para establecer la cantidad de elementos a procesar antes de devolver los datos y no funciona fuera del alcance. Si establece un valor de x, DynamoDB devuelve los primeros x elementos coincidentes.

El valor LastEvaluateKey también se aplica en casos de parámetros de límite que arrojan resultados parciales. Úselo para completar escaneos.

Result Count - Las respuestas a consultas y análisis también incluyen información relacionada con ScannedCounty Count, que cuantifican los artículos escaneados / consultados y cuantifican los artículos devueltos. Si no filtra, sus valores son idénticos. Cuando excede 1 MB, los recuentos representan solo la parte procesada.

Consistency- Los resultados de las consultas y los resultados del análisis son lecturas coherentes, sin embargo, también puede establecer lecturas muy coherentes. Utilizar elConsistentRead parámetro para cambiar esta configuración.

Note - La configuración de lectura constante afecta el consumo al utilizar el doble de unidades de capacidad cuando se establece en muy consistente.

Performance- Las consultas ofrecen un mejor rendimiento que las exploraciones debido a las exploraciones que rastrean la tabla completa o el índice secundario, lo que da como resultado una respuesta lenta y un gran consumo de rendimiento. Los escaneos funcionan mejor para tablas pequeñas y búsquedas con menos filtros; sin embargo, puede diseñar escaneos ajustados al obedecer algunas prácticas recomendadas, como evitar la actividad de lectura repentina y acelerada y aprovechar los escaneos paralelos.

Una consulta encuentra un cierto rango de claves que satisfacen una condición determinada, con el rendimiento dictado por la cantidad de datos que recupera en lugar del volumen de claves. Los parámetros de la operación y el número de coincidencias influyen específicamente en el rendimiento.

Escaneo paralelo

Las operaciones de exploración realizan el procesamiento de forma secuencial de forma predeterminada. Luego, devuelven datos en porciones de 1 MB, lo que le pide a la aplicación que busque la siguiente porción. Esto da como resultado exploraciones largas para tablas e índices grandes.

Esta característica también significa que es posible que los escaneos no siempre aprovechen por completo el rendimiento disponible. DynamoDB distribuye los datos de la tabla en varias particiones; y el rendimiento del escaneo permanece limitado a una sola partición debido a su operación de una sola partición.

Una solución para este problema proviene de la división lógica de tablas o índices en segmentos. Luego, los “trabajadores” escanean segmentos paralelos (simultáneamente). Utiliza los parámetros de Segmento yTotalSegments para especificar segmentos escaneados por ciertos trabajadores y especificar la cantidad total de segmentos procesados.

Número de trabajador

Debe experimentar con valores de trabajador (parámetro de segmento) para lograr el mejor rendimiento de la aplicación.

Note- Los escaneos en paralelo con grandes conjuntos de trabajadores afectan el rendimiento al consumir posiblemente todo el rendimiento. Administre este problema con el parámetro Limit, que puede usar para evitar que un solo trabajador consuma todo el rendimiento.

El siguiente es un ejemplo de escaneo profundo.

Note- El siguiente programa puede asumir una fuente de datos creada previamente. Antes de intentar ejecutar, adquiera bibliotecas de soporte y cree las fuentes de datos necesarias (tablas con las características requeridas u otras fuentes referenciadas).

Este ejemplo también utiliza Eclipse IDE, un archivo de credenciales de AWS y AWS Toolkit dentro de un proyecto Eclipse AWS Java.

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.ItemCollection;
import com.amazonaws.services.dynamodbv2.document.ScanOutcome;
import com.amazonaws.services.dynamodbv2.document.Table;

public class ScanOpSample {  
   static DynamoDB dynamoDB = new DynamoDB(
      new AmazonDynamoDBClient(new ProfileCredentialsProvider())); 
   static String tableName = "ProductList";  
   
   public static void main(String[] args) throws Exception { 
      findProductsUnderOneHun();                       //finds products under 100 dollars
   }  
   private static void findProductsUnderOneHun() { 
      Table table = dynamoDB.getTable(tableName);
      Map<String, Object> expressionAttributeValues = new HashMap<String, Object>(); 
      expressionAttributeValues.put(":pr", 100); 
         
      ItemCollection<ScanOutcome> items = table.scan ( 
         "Price < :pr",                                  //FilterExpression 
         "ID, Nomenclature, ProductCategory, Price",     //ProjectionExpression 
         null,                                           //No ExpressionAttributeNames  
         expressionAttributeValues);
         
      System.out.println("Scanned " + tableName + " to find items under $100."); 
      Iterator<Item> iterator = items.iterator(); 
         
      while (iterator.hasNext()) { 
         System.out.println(iterator.next().toJSONPretty()); 
      }     
   } 
}