DynamoDBにAthenaでSQL!

最近EMRからDynamoDBを操作することにハマっているDynamoおじさんです。

# この記事の内容
DynamoDBのデータはDataPiplineを使用してS3にエクスポートができます。
このデータは1行1JSONの構造になっているので、Athenaからクエリーが投げられると思いつき、実際に試してみた結果です。

# 所感
最初に結論を言ってしまうと、現状では使用は限られるんじゃないかなと思います。
CLIやSDKからレポートを出力出来るようになったら、使えるところが広がりそう・・・と言ったところです。

# 前提条件
- DynamoDBからエクスポートしたデータがS3上に保管されていること

エクスポートができているJSONデータを操作します。

# 事前準備（エクスポート）
エクスポートについて簡単に手順を確認します。

## 1.DynamoDBテーブルを選択し、エクスポートを選択する
![スクリーンショット 2017-03-14 11.10.52.png](https://qiita-image-store.s3.amazonaws.com/0/52141/d31b3cd9-d096-fd02-e2f9-309d097f762a.png "スクリーンショット 2017-03-14 11.10.52.png")


テーブルを選択した状態でエクスポートを選択します。

## 2.DataPiplineの設定

![スクリーンショット_2017-03-14_11_13_13.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/e31aa003-48bb-a66f-9039-93fabb2700ff.jpeg "スクリーンショット_2017-03-14_11_13_13.jpg")

![スクリーンショット 2017-03-14 11.13.25.png](https://qiita-image-store.s3.amazonaws.com/0/52141/4c187d33-784c-ff29-8080-00da90225997.png "スクリーンショット 2017-03-14 11.13.25.png")

__だいじと書いたrateに関して__
これはDynamoDBテーブルが確保したRCUの内、今回の処理でDataPiplineが使用する割合を記載します。
注意としてはアクセル踏みすぎたりすることは多分にあります。

設定が終わったらActivateしましょう。起動します。
詳細設定は可能なので環境に応じてカスタマイズしてください。

# Athenaの設定
S3にデータが出力されたあとの話に移ります。
実際にAthenaを使用してDynamoDBのデータにSQLを投げてみます
Athenaは現在東京リージョンでは使用できないのでバージニアで使用します（一番上だったし）

![スクリーンショット 2017-03-14 11.21.27.png](https://qiita-image-store.s3.amazonaws.com/0/52141/ccfb3bfa-ecae-9f35-59cf-2a641e1b608b.png "スクリーンショット 2017-03-14 11.21.27.png")

お約束の画面
![スクリーンショット 2017-03-14 11.23.30.png](https://qiita-image-store.s3.amazonaws.com/0/52141/49f6c529-9b43-4ed4-7f69-2a9e06f119cf.png "スクリーンショット 2017-03-14 11.23.30.png")

Catalog Manager ->  Add table

と選択して上記の画面へ遷移する

適当にDB、テーブルを指定・作成します
中ほどにあるS3パスが大事です。

東京リージョンのバケットだろうと関係ないので

 ```
 s3://オブジェクトまでのパス/
 ```
 
 を書いて次へ

![スクリーンショット 2017-03-14 11.26.28.png](https://qiita-image-store.s3.amazonaws.com/0/52141/c175c537-9e7a-208d-ba31-d39d3866f14a.png "スクリーンショット 2017-03-14 11.26.28.png")

Importするデータ形式を選ぶのでJSONを選択

![スクリーンショット 2017-03-14 11.27.27.png](https://qiita-image-store.s3.amazonaws.com/0/52141/57dd734f-1d83-b1c3-9ae8-38e3c7d6e159.png "スクリーンショット 2017-03-14 11.27.27.png")

カラム名と形式を指定します。
その次のところはまあ、デフォルトでいいので指定するとAthenaはテーブルを作ってくれます。

##### かんたんでしょ？

ただし、こうやって作成すると

```json:json
{"name":{"s":"mnono-morikubo"},"type":{"s":"cool"},"comment":{"s":"murii"}}
```

みたいなのが元になっているJSONだとすると、これで読み込むと各カラムがこんな感じになります

```json:name
{"s":"mnono-morikubo"}
```

```json:type
{"s":"cool"}
```

```json:comment
{"s":"murii"}
```

selectで出てきた結果がこれじゃ困りますね？
JSONに対応させましょう


# JSONに対応したテーブルの作成

![スクリーンショット 2017-03-14 11.35.10.png](https://qiita-image-store.s3.amazonaws.com/0/52141/17e97366-430c-99b2-742a-fb1227681584.png "スクリーンショット 2017-03-14 11.35.10.png")

この画面の右側にコマンドを書いてきます

 ```sql:テーブル定義
 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ファイルを検索してみる](http://dev.classmethod.jp/cloud/aws/athena-json/)
 
# クエリ
 
ここまで来てしまえば完成ですが最後にクエリだけ

```sql:クエリ
SELECT
  name.s as name,
  type.s as type,
  comment.s as comment
FROM
  test_tb

limit 100;
```

![スクリーンショット_2017-03-13_19_27_54.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/1df5532d-f75c-1f00-7245-1ff7a9b627f4.jpeg "スクリーンショット_2017-03-13_19_27_54.jpg")


# まとめ
EMRでhive使ってDynamoDB操作していたのでそういえばAthenaもなんか似た感じだったな・・・と思い試してみましたが、裏側は多分同じなんでしょうね。
いちいちクラスターを準備せず、クエリー単位での課金なので、日次でデータをdumpしたりしている場合はテーブルさえ作っておけばキャパシティを消費せずにSQLがかけるので便利なこともあるかもしれません。

まあ、CLIが出てこないとなんとも言えませんがね。
アップデートに期待です。