AWS DynamoDBへサンプルデータを投入しクエリーを出す(Java)

| コメントをどうぞ

前記事の AWS DynamoDBのサンプル(Java) では、SDKをダウンロードし、よく分からないまま実行しただけなので、開発者ガイドの使用開始 に沿って実行してみます。

ステップ 1: 開始する前に

Sign Upし、AWS SDK for Javaをダウンロードします。
今回AWS Toolkit for Eclipse もインストールしました。

ステップ 2: サンプルテーブルの作成

ドキュメントではテーブルを手作業でGUIから入力して作成していますが、実際の運用でそれはないだろう・・・ということで、プログラムで作成します。
AWS SDK for Java 低レベル API を使用した、サンプルテーブルの作成とデータのアップロード のJavaソースをファイルに保存します。
このままでは実行時にエラーとなるので、クラスファイルを同じディレクトリにAwsCredentials.propertiesファイルを用意し、accessKeyとsecretKeyを設定します。前記事のサンプルでは%USER_HOME%.aws\credentials にaws_access_key_idとaws_secret_access_keyを設定したものとは異なります。

次にこのままでも実行できるのですが、リージョン指定がないため、us-east-1 (N. Virginia)に作成されます。今回はap-northeast-1 (Tokyo)に作成したかったので、ソースを一部修正しました。

client = new AmazonDynamoDBClient(credentials);
Region apNortheast1 = Region.getRegion(Regions.AP_NORTHEAST_1);
client.setRegion(apNortheast1);

AWSコンソールから確認すると、4つのテーブルが出ており、ReplyテーブルにはIndexが張られています。
aws-dynamodb2a

ステップ 3: データをテーブルにロードする

テーブルを作成した際に、データもロードされています。
AWSコンソールから確認します。
aws-dynamodb2b

Eclipseからも確認できます。
aws-dynamodb2c

ステップ 4: クエリを試行する

AWS SDK for Java を使用してクエリを試行 のJavaソースをファイルに保存します。
テーブル作成と同様にクラスファイルを同じディレクトリにAwsCredentials.propertiesファイルを用意します。
リージョン指定がないため、ap-northeast-1 (Tokyo)を指定するように、ソースを一部修正しました。

client = new AmazonDynamoDBClient(credentials);
Region apNortheast1 = Region.getRegion(Regions.AP_NORTHEAST_1);
client.setRegion(apNortheast1);

実行すると取得できます。

Printing item after retrieving it....
ISBN S=[111-1111111111]
Id N=[101]
Authors SS=[[Author1]]
Title S=[Book 101 Title]
ReplyDateTime S=[2014-08-13T12:50:03.327Z]
Message S=[DynamoDB Thread 1 Reply 2 text]
PostedBy S=[User B]

試しに15日前から22日前に変更すると、2件取得できます。

long twoWeeksAgoMilli = (new Date()).getTime() - (22L*24L*60L*60L*1000L);
ReplyDateTime S=[2014-08-06T12:50:03.327Z]
Message S=[DynamoDB Thread 1 Reply 1 text]
PostedBy S=[User A]
ReplyDateTime S=[2014-08-13T12:50:03.327Z]
Message S=[DynamoDB Thread 1 Reply 2 text]
PostedBy S=[User B]

ソースのMap<String, AttributeValue> lastEvaluatedKeyはなんだろう?と出力してみると、返した最後のアイテムを持っていて、イテレートできるようになっています。

lastEvaluatedKey={ReplyDateTime={S: 2014-08-06T12:50:03.327Z,}, Id={S: Amazon DynamoDB#DynamoDB Thread 1,}}
lastEvaluatedKey=null

なお、ReplyDateTimeはString型のため、単純に文字列の大小比較を行っているだけです。タイムゾーンがGMT(Z)となっていますが、異なるタイムゾーンが混在したらクエリーで正確な大小比較できないってことですね。
利用できる型は、スカラーデータ型(Number, String, Binary)と多値型(String Set, Number Set, Binary Set)の6種類だけです。
詳しくは DynamoDB データモデル を参照してください。

コメントを残す

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

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