Amazon DynamoDB
开发人员指南 (API Version 2012-08-10)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

使用 全局二级索引:Java

您可以使用 AWS SDK for Java 文档 API 创建具有一个或多个全局二级索引的表,描述表中的索引,并使用索引执行查询。

下面是执行表操作的常见步骤。

  1. 创建 DynamoDB 类的实例。

  2. 通过创建对应的请求数据元,为操作提供必需参数和可选参数。

  3. 调用您在前面步骤中创建的客户端提供的适当方法。

创建含有全局二级索引的表

您可在创建表的同时创建全局二级索引。为此,请使用 CreateTable 并提供一个或多个全局二级索引的规格。以下 Java 代码段创建一个保存天气数据信息的表。分区键为 Location,排序键为 Date。通过一个名为 PrecipIndex 的 全局二级索引,可以快速访问各个位置的降水数据。

下面是使用 DynamoDB 文档 API 创建具有 全局二级索引 的表的步骤。

  1. 创建 DynamoDB 类的实例。

  2. 创建 CreateTableRequest 类实例,以提供请求信息。

    您必须提供表名称、主键以及预置吞吐量值。对于全局二级索引,您必须提供索引名称、其预置的吞吐量设置、索引排序键的属性定义、索引的键架构以及属性投影。

  3. 以参数形式提供请求对象,以调用 createTable 方法。

以下 Java 代码段执行的就是上述步骤。该代码段创建含有 全局二级索引 (PrecipIndex) 的表 (WeatherData)。索引分区键为 Date,其排序键为 Precipitation。所有表属性都投影到索引中。用户可以查询此索引以获得特定日期的天气数据,也可按降水量对数据进行排序。

请注意,由于 Precipitation 不是该表的键属性,因此它不是必需的;然而,不含 Precipitation 的 WeatherData 项目不会出现在 PrecipIndex 中。

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

您必须等待 DynamoDB 创建该表并将表的状态设置为 ACTIVE。然后,您就可以开始在表中添加数据元项目。

描述含有 全局二级索引 的表

要获取有关表中的全局二级索引的信息,请使用 DescribeTable。对于每个索引,您都可以查看其名称、键架构和投影的属性。

下面是访问表中的全局二级索引信息的步骤。

  1. 创建 DynamoDB 类的实例。

  2. 创建 Table 类的实例来代表要处理的索引。

  3. 调用 Table 对象上的 describe 方法。

以下 Java 代码段执行的就是上述步骤。

Copy
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()); } }

查询 全局二级索引

您可以对全局二级索引使用 Query (基本上与对表执行 Query 操作相同)。您需要指定索引名称、索引分区键和排序键 (如果有) 的查询条件以及要返回的属性。在此示例中,索引为 PrecipIndex,它具有分区键 Date 和排序键 Precipitation。该索引查询返回降水量大于零的特定日期的所有天气数据。

下面是使用 AWS SDK for Java 文档 API 查询 全局二级索引 的步骤。

  1. 创建 DynamoDB 类的实例。

  2. 创建 Table 类的实例来代表要处理的索引。

  3. 为要查询的索引创建 Index 类的实例。

  4. 调用 Index 对象上的 query 方法。

属性名称 Date 是一个 DynamoDB 保留关键字。因此,我们必须使用表达式属性名称作为 KeyConditionExpression 中的占位符。

以下 Java 代码段执行的就是上述步骤。

Copy
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()); }