Amazon DynamoDB
開発者ガイド (API バージョン 2012-08-10)

グローバルセカンダリインデックスの使用: Java

AWS SDK for Java ドキュメント API を使用して、1 つ以上のグローバルセカンダリインデックスを持つ Amazon DynamoDB テーブルを作成し、テーブルのインデックスについて説明し、インデックスを使用してクエリを実行することができます。

以下に、テーブルオペレーションの一般的な手順を示します。

  1. DynamoDB クラスのインスタンスを作成します。

  2. 対応するリクエストオブジェクトを作成して、オペレーションについて必要なパラメータとオプションパラメータを入力します。

  3. 前述のステップで作成したクライアントから提供された適切なメソッドを呼び出します。

グローバルセカンダリインデックス を使用したテーブルの作成

グローバルセカンダリインデックスは、テーブルの作成と同時に作成できます。そのためには、CreateTable を使用して、1 つ以上のグローバルセカンダリインデックスの仕様を指定します。次の Java コード例では、気象データに関する情報を格納するテーブルを作成します。パーティションキーは Location で、ソートキーは Date です。PrecipIndex という名前の グローバルセカンダリインデックス は、さまざまな場所の降水量データに高速アクセスできます。

次に、DynamoDB ドキュメント API を使用して、グローバルセカンダリインデックス があるテーブルを作成するステップを示します。

  1. DynamoDB クラスのインスタンスを作成します。

  2. リクエスト情報を指定する CreateTableRequest クラスのインスタンスを作成します。

    テーブル名、プライマリキー、プロビジョニング済みスループットの値を指定する必要があります。グローバルセカンダリインデックスについては、インデックス名、そのプロビジョニングされたスループット設定、インデックスソートキーの属性定義、インデックスのキースキーマ、属性射影を指定する必要があります。

  3. リクエストオブジェクトをパラメータとして指定して、createTable メソッドを呼び出します。

以下の Java コード例は、前述のステップの例です。このコードは、グローバルセカンダリインデックス (PrecipIndex) でテーブル (WeatherData) を作成します。インデックスパーティションキーは Date で、そのソートキーは Precipitation です。すべてのテーブル属性がインデックスに射影されます。ユーザーは、このインデックスに対してクエリを実行して、特定の日付の気象データを取得でき、必要に応じて、降水量別にデータを並べ替えることができます。

Precipitation はテーブルのキー属性ではないので、必須ではありません。ただし、Precipitation のない WeatherData 項目は 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());

DynamoDB がテーブルを作成し、テーブルのステータスを ACTIVE に設定するまで待機する必要があります。その後は、データ項目をテーブルに書き込むことが可能になります。

グローバルセカンダリインデックス のあるテーブルの説明

テーブルでグローバルセカンダリインデックスの詳細を取得するには、「DescribeTable」を参照してください。各インデックスについて、名前、キースキーマ、射影された属性にアクセスできます。

次に、テーブルの グローバルセカンダリインデックス 情報にアクセスするステップを示します。

  1. DynamoDB クラスのインスタンスを作成します。

  2. 操作対象のインデックスを表すために、Table クラスのインスタンスを作成します。

  3. describe オブジェクトで Table メソッドを呼び出します。

以下の Java コード例は、前述のステップの例です。

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. query オブジェクトで Index メソッドを呼び出します。

属性名 Date は、DynamoDB の予約語です。したがって、式の属性名を KeyConditionExpression のプレースホルダーとして使用する必要があります。

以下の Java コード例は、前述のステップの例です。

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