DynamoDB のデータを Athena を使ってクエリする

## はじめに
新年、明けましておめでとうございます！
今回は Amazon DynamoDB のデータを Amazon Athena でクエリを実行して表示させるまでの流れを紹介いたします。

## DynamoDB に値を格納し、S3にエクスポート
今回は仮として以下のデータを DynamoDB に格納しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/c0205eb8-8b08-65f2-1788-52586eefb6e1.png)

この DynamoDB に格納したデータを S3 バケットにエクスポートします。
その前にポイントインタイムリカバリ（PITR）を有効化する必要があります。PITRとは、指定した過去の任意の時点にデータベースを復元できる機能です。バックアップリカバリ期間は最大35日まで選択できます。
デフォルトではオフの状態のため、これを編集で有効化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/483ccdcc-fb4f-c2af-d688-10be9a4540f5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/d191b9fe-244e-13d2-e084-e80d7c888a0c.png)

これで、DynamoDB から S3 バケットにエクスポートが可能となります。
エクスポートおよびストリームタブからS3へのエクスポートを選択し、設定を入力していきます。
送信先のS3バケットは任意のバケット名を入力してください。その他はデフォルトのまま、エクスポートします。エクスポートにはだいたい10分程度かかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/b42b06eb-f18a-d86e-f66a-222421b4cfe9.png)

エクスポートが完了したら、指定したS3バケットにデータが格納されていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/17d3d471-b60b-645d-fc9b-b0edeed77be8.png)

## Crawler でテーブルを作成
Athena でクエリを実行するために Crawler で新しくテーブルを作成します。
※ Glue は日本語が未対応のため、英語表示になります。

#### Step 1 Set crawler properties
Crawler の名前を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/cda70519-6a5b-aca8-6db0-f9dc7aa3e5e5.png)

#### Step 2 Choose data sources and classifiers
Data sources を追加します。ここで、先ほどエクスポートした S3 バケットの中身を指定します。S3 path は以下になります。（途中の値は環境によって変わります。）
```
s3://ari-hirose-query-test/AWSDynamoDB/01736385088969-cd8dea7e/data/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/6500d9b7-97b2-b74e-4ec2-edc89e047a8d.png)

#### Step 3 Configure security settings
IAM role を新しく作成しました。名前は任意に設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/f21adac0-1fa7-318e-4077-91c410254da4.png)

#### Step 4 Set output and scheduling
今回は新しくデータベースを作成しました。Add database をクリックすると作成ページに
遷移します。
また、デフォルトのままだとテーブル名は自動生成されるため、必要に応じて prefix を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/3a182f9b-31ce-e7a1-bc33-a9abc9b2287f.png)

#### Step 5 Review and create
最後に設定内容を確認し、問題なければ Crawler を作成します。
作成完了後、Run Crawler をクリックし、Crawler を実行します。こちらは1分程度で実行が完了しました。Status が Completed になれば、成功です。

ここで、私が躓いたポイントなのですが、作成されたテーブルを見てみると Schema が登録されていませんでした。そのため、手動で Column name に item を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/b6a01a9a-9b4f-c59f-4bc2-6899c72fc4a6.png)

また、Actions から Edit table を選択し、以下の内容を登録します。

- Input format：org.apache.hadoop.mapred.TextInputFormat
- Output format：org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
- Serde name：org.openx.data.jsonserde.JsonSerDe
- Serialization：liborg.openx.data.jsonserde.JsonSerDe

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/7f8008d2-5d73-80ba-0c05-8ae97a38b706.png)

## Athena でクエリを実行
Athena でテーブルのプレビューを実行すると、以下のように問題なく結果が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/345120f7-320a-6fcc-c1c8-7917f70a9464.png)

例えば、num の値が 600 以上のデータを表示させたい場合は、以下のクエリ文を実行すると表示が可能です。

```example.sql
SELECT
  json_extract_scalar(item, '$.date.s') AS date_value,
  CAST(json_extract_scalar(item, '$.num.s') AS INT) AS num_value,
  json_extract_scalar(item, '$.text.s') AS text_value
FROM "ari-hirose-database-test"."hirosedata"
WHERE CAST(json_extract_scalar(item, '$.num.s') AS INT) >= 600;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777988/4a01b686-1636-f1ea-0916-19216e243bb1.png)

無事表示されましたね！

## 仲間を募集しています！

ARIではエンジニア・ITコンサルタント・PM職全方位で仲間を募集しております。
カジュアル面談、随時受付中です！
ご興味ある方はこちらをご覧ください。

https://note.com/ari_hr/n/n4aed9ba75421