最近EMRからDynamoDBを操作することにハマっているDynamoおじさんです。
この記事の内容
DynamoDBのデータはDataPiplineを使用してS3にエクスポートができます。
このデータは1行1JSONの構造になっているので、Athenaからクエリーが投げられると思いつき、実際に試してみた結果です。
所感
最初に結論を言ってしまうと、現状では使用は限られるんじゃないかなと思います。
CLIやSDKからレポートを出力出来るようになったら、使えるところが広がりそう・・・と言ったところです。
前提条件
- DynamoDBからエクスポートしたデータがS3上に保管されていること
エクスポートができているJSONデータを操作します。
事前準備(エクスポート)
エクスポートについて簡単に手順を確認します。
1.DynamoDBテーブルを選択し、エクスポートを選択する
テーブルを選択した状態でエクスポートを選択します。
2.DataPiplineの設定
だいじと書いたrateに関して
これはDynamoDBテーブルが確保したRCUの内、今回の処理でDataPiplineが使用する割合を記載します。
注意としてはアクセル踏みすぎたりすることは多分にあります。
設定が終わったらActivateしましょう。起動します。
詳細設定は可能なので環境に応じてカスタマイズしてください。
Athenaの設定
S3にデータが出力されたあとの話に移ります。
実際にAthenaを使用してDynamoDBのデータにSQLを投げてみます
Athenaは現在東京リージョンでは使用できないのでバージニアで使用します(一番上だったし)
Catalog Manager -> Add table
と選択して上記の画面へ遷移する
適当にDB、テーブルを指定・作成します
中ほどにあるS3パスが大事です。
東京リージョンのバケットだろうと関係ないので
s3://オブジェクトまでのパス/
を書いて次へ
Importするデータ形式を選ぶのでJSONを選択
カラム名と形式を指定します。
その次のところはまあ、デフォルトでいいので指定するとAthenaはテーブルを作ってくれます。
かんたんでしょ?
ただし、こうやって作成すると
{"name":{"s":"mnono-morikubo"},"type":{"s":"cool"},"comment":{"s":"murii"}}
みたいなのが元になっているJSONだとすると、これで読み込むと各カラムがこんな感じになります
{"s":"mnono-morikubo"}
{"s":"cool"}
{"s":"murii"}
selectで出てきた結果がこれじゃ困りますね?
JSONに対応させましょう
JSONに対応したテーブルの作成
この画面の右側にコマンドを書いてきます
CREATE EXTERNAL TABLE sampledb.test_tb (
name struct <s:string>,
type struct <s:string>,
comment struct <s:string>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://オブジェクトまでのパス/';
こんな感じに定義することでJSONに対応させることができます。
この辺の詳しい説明はおなじみの大御所、以下の記事を参考にしました。
Amazon Athenaを使ってJSONファイルを検索してみる
クエリ
ここまで来てしまえば完成ですが最後にクエリだけ
SELECT
name.s as name,
type.s as type,
comment.s as comment
FROM
test_tb
limit 100;
まとめ
EMRでhive使ってDynamoDB操作していたのでそういえばAthenaもなんか似た感じだったな・・・と思い試してみましたが、裏側は多分同じなんでしょうね。
いちいちクラスターを準備せず、クエリー単位での課金なので、日次でデータをdumpしたりしている場合はテーブルさえ作っておけばキャパシティを消費せずにSQLがかけるので便利なこともあるかもしれません。
まあ、CLIが出てこないとなんとも言えませんがね。
アップデートに期待です。