AWS DynamoDBの項目の取得(Java)

| コメントをどうぞ

前記事の AWS DynamoDBへサンプルデータを投入しクエリーを出す(Java) ではテーブルを作成し、データを投入しましたので、このテーブルを使ってAPIを詳しく使ってみます。
まずは項目の取得です。

4つのテーブルにgetItemを実行してみました。

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.PropertiesCredentials;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;
import com.amazonaws.services.dynamodbv2.model.GetItemRequest;
import com.amazonaws.services.dynamodbv2.model.GetItemResult;

public class GetItem {

    static AmazonDynamoDBClient client;

    public static void main(String[] args) throws Exception {
        try {
            createClient();
            getItem("ProductCatalog", "Id", 102);
            getItem("Forum", "Name", "Amazon DynamoDB");
            getItem("Thread", "ForumName", "Amazon DynamoDB", "Subject", "DynamoDB Thread 1");
            getItem("Reply", "Id", "Amazon DynamoDB#DynamoDB Thread 1", "ReplyDateTime", "2014-08-06T12:50:03.327Z");
        }  
        catch (AmazonServiceException ase) {
            System.err.println(ase.getMessage());
        }  
    }

    private static void createClient() throws IOException {
        AWSCredentials credentials = new PropertiesCredentials(
                AmazonDynamoDBSampleData_TryQuery.class.getResourceAsStream("AwsCredentials.properties"));
        client = new AmazonDynamoDBClient(credentials);
        Region apNortheast1 = Region.getRegion(Regions.AP_NORTHEAST_1);
        client.setRegion(apNortheast1);
    }

    private static void getItem(String tableName, String hashName, int id) {
        System.out.println("--- "+tableName+" ---");
        Map<String, AttributeValue> key = new HashMap<String, AttributeValue>();
        key.put(hashName, new AttributeValue().withN(Integer.toString(id)));
        GetItemRequest getItemRequest = new GetItemRequest()
            .withTableName(tableName)
            .withKey(key);
        GetItemResult result = client.getItem(getItemRequest);
        printItem(result.getItem());            
    }

    private static void getItem(String tableName, String hashName, String id) {
        System.out.println("--- "+tableName+" ---");
        Map<String, AttributeValue> key = new HashMap<String, AttributeValue>();
        key.put(hashName, new AttributeValue().withS(id));
        GetItemRequest getItemRequest = new GetItemRequest()
            .withTableName(tableName)
            .withKey(key);
        GetItemResult result = client.getItem(getItemRequest);
        printItem(result.getItem());            
    }

    private static void getItem(String tableName, String hashName, String id, String rangeName, String id2) {
        System.out.println("--- "+tableName+" ---");
        Map<String, AttributeValue> key = new HashMap<String, AttributeValue>();
        key.put(hashName, new AttributeValue().withS(id));
        key.put(rangeName, new AttributeValue().withS(id2));
        GetItemRequest getItemRequest = new GetItemRequest()
            .withTableName(tableName)
            .withKey(key);
        GetItemResult result = client.getItem(getItemRequest);
        printItem(result.getItem());            
    }

    private static void printItem(Map<String, AttributeValue> attributeList) {
        for (Map.Entry<String, AttributeValue> item : attributeList.entrySet()) {
            String attributeName = item.getKey();
            AttributeValue value = item.getValue();
            System.out.println(attributeName + " "
                    + (value.getS() == null ? "" : "S=[" + value.getS() + "]")
                    + (value.getN() == null ? "" : "N=[" + value.getN() + "]")
                    + (value.getB() == null ? "" : "B=[" + value.getB() + "]")
                    + (value.getSS() == null ? "" : "SS=[" + value.getSS() + "]")
                    + (value.getNS() == null ? "" : "NS=[" + value.getNS() + "]")
                    + (value.getBS() == null ? "" : "BS=[" + value.getBS() + "] n"));
        }
    }
}

実行結果はこちら

--- ProductCatalog ---
PageCount N=[600]
InPublication N=[1]
ISBN S=[222-2222222222]
Dimensions S=[8.5 x 11.0 x 0.8]
Price N=[20]
Id N=[102]
ProductCategory S=[Book]
Authors SS=[[Author1, Author2]]
Title S=[Book 102 Title]
--- Forum ---
Name S=[Amazon DynamoDB]
Messages N=[4]
Threads N=[2]
Category S=[Amazon Web Services]
Views N=[1000]
--- Thread ---
Tags SS=[[index, primarykey, table]]
ForumName S=[Amazon DynamoDB]
Answered N=[0]
LastPostedDateTime S=[2014-08-13T12:50:03.192Z]
Message S=[DynamoDB thread 1 message]
Subject S=[DynamoDB Thread 1]
Views N=[0]
LastPostedBy S=[User A]
Replies N=[0]
--- Reply ---
ReplyDateTime S=[2014-08-06T12:50:03.327Z]
Message S=[DynamoDB Thread 1 Reply 1 text]
Id S=[Amazon DynamoDB#DynamoDB Thread 1]
PostedBy S=[User A]

動いておしまいという感じですが、作っている最中はThreadとReplyのテーブルではgetItemが出来ないでエラーとなっていました。
他のProductCatalogとForumと同様にhashKeyだけでgetItemしていました。
よくよくデータを見てみると、ThreadテーブルはForumNameとSubjectの複合キーなので、ForumNameだけを指定すると2件以上ヒットする可能性があります。
getItemは文字通り1件のみを返すことが前提となっているので、条件があいまいだと下記のランタイムエラーとなります。
The provided key element does not match the schema (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: xxx)

その他、注記すべき点としては、ProductCatalogはNumber型のhashKeyなのでwithN()を使い、その他はString型なのでwithS()を使っています。型を間違えても同じように下記のランタイムエラーとなります。
The provided key element does not match the schema (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: xxx)

戻り値がSS=なものはString Set型で、複数の文字列が返っています。
Binary型以外はだいたい網羅できているサンプルとなっています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>