Utilisation d'index secondaires globaux : Java - Amazon DynamoDB

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation d'index secondaires globaux : Java

Vous pouvez utiliser l'API Document d'AWS SDK for Java pour créer une table Amazon DynamoDB avec un ou plusieurs index secondaires globaux, décrire les index sur la table, et effectuer des requêtes à l'aide des index.

Voici les étapes courantes pour les opérations de table.

  1. Créez une instance de la classe DynamoDB.

  2. Fournissez les paramètres obligatoires et facultatifs pour l'opération en créant les objets de requête correspondants.

  3. Appelez la méthode appropriée fournie par le client, que vous avez créée à l'étape précédente.

Créer une table avec un index secondaire global

Vous pouvez créer des index secondaires globaux au moment où vous créez une table. Pour ce faire, utilisez CreateTable et fournissez vos spécifications pour un ou plusieurs index secondaires globaux. L'exemple de code Java suivant crée une table destinée à accueillir des données météorologiques. La clé de partition est Location, et la clé de tri Date. Un index secondaire global nommé PrecipIndex permet un accès rapide aux données de précipitations pour différents endroits.

Voici les étapes à suivre pour créer une table avec un index secondaire global à l'aide de l'API Document DynamoDB.

  1. Créez une instance de la classe DynamoDB.

  2. Créez une instance de la classe CreateTableRequest pour fournir l'information de requête.

    Vous devez fournir le nom de la table, sa clé primaire et les valeurs de débit approvisionné. Pour l'index secondaire global, vous devez fournir le nom de l'index, ses paramètres de débit approvisionné, les définitions d'attribut pour la clé de tri d'index, le schéma de clé pour l'index et la projection d'attribut.

  3. Appelez la méthode createTable en fournissant l'objet de demande comme paramètre.

L'exemple de code Java suivant illustre les tâches précédentes. Le code crée une table (WeatherData) avec un index secondaire global (PrecipIndex). La clé de partition d'index est Date, et la clé de tri Precipitation. Tous les attributs de table sont projetés sur l'index. Les utilisateurs peuvent interroger cet index afin d'obtenir des données météorologiques pour une date particulière, en triant éventuellement les données par quantité de précipitations.

Precipitation n'étant pas un attribut de clé pour la table, il n'est pas obligatoire. Toutefois, les éléments WeatherData sans Precipitation n'apparaissent pas dans PrecipIndex.

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDB dynamoDB = new DynamoDB(client); // Attribute definitions ArrayList<AttributeDefinition> attributeDefinitions = new ArrayList<AttributeDefinition>(); attributeDefinitions.add(new AttributeDefinition() .withAttributeName("Location") .withAttributeType("S")); attributeDefinitions.add(new AttributeDefinition() .withAttributeName("Date") .withAttributeType("S")); attributeDefinitions.add(new AttributeDefinition() .withAttributeName("Precipitation") .withAttributeType("N")); // Table key schema ArrayList<KeySchemaElement> tableKeySchema = new ArrayList<KeySchemaElement>(); tableKeySchema.add(new KeySchemaElement() .withAttributeName("Location") .withKeyType(KeyType.HASH)); //Partition key tableKeySchema.add(new KeySchemaElement() .withAttributeName("Date") .withKeyType(KeyType.RANGE)); //Sort key // PrecipIndex GlobalSecondaryIndex precipIndex = new GlobalSecondaryIndex() .withIndexName("PrecipIndex") .withProvisionedThroughput(new ProvisionedThroughput() .withReadCapacityUnits((long) 10) .withWriteCapacityUnits((long) 1)) .withProjection(new Projection().withProjectionType(ProjectionType.ALL)); ArrayList<KeySchemaElement> indexKeySchema = new ArrayList<KeySchemaElement>(); indexKeySchema.add(new KeySchemaElement() .withAttributeName("Date") .withKeyType(KeyType.HASH)); //Partition key indexKeySchema.add(new KeySchemaElement() .withAttributeName("Precipitation") .withKeyType(KeyType.RANGE)); //Sort key precipIndex.setKeySchema(indexKeySchema); CreateTableRequest createTableRequest = new CreateTableRequest() .withTableName("WeatherData") .withProvisionedThroughput(new ProvisionedThroughput() .withReadCapacityUnits((long) 5) .withWriteCapacityUnits((long) 1)) .withAttributeDefinitions(attributeDefinitions) .withKeySchema(tableKeySchema) .withGlobalSecondaryIndexes(precipIndex); Table table = dynamoDB.createTable(createTableRequest); System.out.println(table.getDescription());

Vous devez attendre que DynamoDB crée la table et définisse l'état de celle-ci sur ACTIVE. Après cela, vous pouvez commencer à insérer des éléments de données dans la table.

Décrire une table avec un index secondaire global

Pour obtenir des informations concernant les index secondaires globaux sur une table, utilisez l'opération DescribeTable. Pour chaque index, vous pouvez accéder à son nom, à son schéma de clé et aux attributs projetés.

Voici les étapes à suivre pour accéder aux informations d'index secondaire global sur une table.

  1. Créez une instance de la classe DynamoDB.

  2. Créez une instance de la classe Table pour représenter l'index que vous souhaitez utiliser.

  3. Appelez la méthode describe sur l'objet Table.

L'exemple de code Java suivant illustre les tâches précédentes.

Exemple
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDB dynamoDB = new DynamoDB(client); Table table = dynamoDB.getTable("WeatherData"); TableDescription tableDesc = table.describe(); Iterator<GlobalSecondaryIndexDescription> gsiIter = tableDesc.getGlobalSecondaryIndexes().iterator(); while (gsiIter.hasNext()) { GlobalSecondaryIndexDescription gsiDesc = gsiIter.next(); System.out.println("Info for index " + gsiDesc.getIndexName() + ":"); Iterator<KeySchemaElement> kseIter = gsiDesc.getKeySchema().iterator(); while (kseIter.hasNext()) { KeySchemaElement kse = kseIter.next(); System.out.printf("\t%s: %s\n", kse.getAttributeName(), kse.getKeyType()); } Projection projection = gsiDesc.getProjection(); System.out.println("\tThe projection type is: " + projection.getProjectionType()); if (projection.getProjectionType().toString().equals("INCLUDE")) { System.out.println("\t\tThe non-key projected attributes are: " + projection.getNonKeyAttributes()); } }

Interroger un index secondaire global

Vous pouvez utiliser l'opération Query sur un index secondaire global de la même manière que vous utilisez l'opération Query sur une table. Vous devez spécifier le nom de l'index, les critères de requête pour la clé de partition d'index et la clé de tri (le cas échéant), ainsi que les attributs que vous souhaitez renvoyer. Dans cet exemple, l'index est PrecipIndex. Il a une clé de partition Date et une clé de tri Precipitation. L'interrogation de l'index renvoie toutes les données météorologiques pour une date particulière, où les précipitations sont supérieures à zéro.

Voici les étapes à suivre pour interroger un index secondaire global à l'aide de l'API Document d'AWS SDK for Java.

  1. Créez une instance de la classe DynamoDB.

  2. Créez une instance de la classe Table pour représenter l'index que vous souhaitez utiliser.

  3. Créez une instance de la classe Index pour l'index que vous souhaitez interroger.

  4. Appelez la méthode query sur l'objet Index.

Nom d'attribut Date est un mot réservé DynamoDB. Par conséquent, vous devez utiliser un nom d'attribut d'expression comme espace réservé dans la KeyConditionExpression.

L'exemple de code Java suivant illustre les tâches précédentes.

Exemple
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build(); DynamoDB dynamoDB = new DynamoDB(client); Table table = dynamoDB.getTable("WeatherData"); Index index = table.getIndex("PrecipIndex"); QuerySpec spec = new QuerySpec() .withKeyConditionExpression("#d = :v_date and Precipitation = :v_precip") .withNameMap(new NameMap() .with("#d", "Date")) .withValueMap(new ValueMap() .withString(":v_date","2013-08-10") .withNumber(":v_precip",0)); ItemCollection<QueryOutcome> items = index.query(spec); Iterator<Item> iter = items.iterator(); while (iter.hasNext()) { System.out.println(iter.next().toJSONPretty()); }