Amazon Athenaを使ってみた

AWS re:Invent 2016のキーノートにて[Amazon Athena](https://aws.amazon.com/jp/athena/)が公開されたので、使ってみました。

# Amazon Athenaとは
公式ページに詳しく載っていますが、簡単に言うとS3を標準SQLでクエリ可能にしたサービスです。

# 早速使ってみる
AWSコンソールログイン後のサービス一覧にはまだ追加されていませんでしたが、公式ページから使ってみます。

# 検索する
サービスに入るとsampledbがすでにセットされているので、まずは検索をかけてみます。

ログイン後の画面は完全にSQL管理画面ですね。
<img width="1454" alt="スクリーンショット 2016-11-30 9.29.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/31363734-7fcb-0559-e5db-611154a3175c.png">

すでにsampledbの中にelb_logsというテーブルがあるので、検索をかけてみます。

```
select * from elb_logs;
```
すぐ結果が返ってきました。素敵。

<img width="1451" alt="スクリーンショット 2016-11-30 9.31.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/99e940c5-cba5-a1ff-9389-ac6e369ab20e.png">

ちなみにここまででS3にアクセスしてみたら、新しいバケットができていました。

<img width="459" alt="スクリーンショット 2016-11-30 9.33.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/3802a4b8-290c-f6b4-942a-b50fe9bcccce.png">


ほかにもいくつか試してみます。全部で何件あるのか確認。

```
select count(*) from elb_logs;
```
<img width="1049" alt="スクリーンショット 2016-11-30 10.15.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/88314986-36f4-5d36-ca05-2e3858fda8d1.png">

backendprocessigntimeが0.2より大きいものを検索。

```
select * from elb_logs where backendprocessingtime > 0.2;
```
<img width="1054" alt="スクリーンショット 2016-11-30 10.23.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/2e19b751-ead0-cb30-f342-3ee1240018f1.png">


カウント数は165件でしたので、無事絞り込めているようです。ちなみにデフォルトの最初の表示件数は99件のようです。スクロールすればもちろん動的に更新されていきますが。

# テーブルを作成してみる
せっかくなので新しくテーブルを作成したいと思います。適当なcsvファイルが必要なようなので、以下のようなデータをS3に登録しておきます。

```
id, name, age, position
1, Yamada, 22, Member
2, Taro, 30, Project Leader
3, Sato, 27, Sub Leader
4, Ichiro, 46, Manager
```

## DB、テーブルの作成
最初にデータベース名とテーブル名、S3のパスを書きます。説明が書いてあるのでS3のパスもどのようにかけばいいのか明確で使いやすいです。ちなみにすでにあるデータベースを使うこともできますし、新しい名前を書けば勝手に新しいデータベースを作成してくれます、これも素敵。
（DDLを見てみると「CREATE EXTERNAL TABLE IF NOT EXIST」となっていたので、仮にテーブルの重複作成をしようとしても防いでくれるようです。どういう動作をするのかまでは知りません。）

<img width="1055" alt="スクリーンショット 2016-11-30 9.32.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/06ded157-8b91-405c-ddc9-479e5b0ffec2.png">

## 形式の選択
S3に保存してあるデータの形式を選択します。今回はCSVを選択します。

<img width="629" alt="スクリーンショット 2016-11-30 9.43.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/5aa7eca6-22e1-78c5-0213-dbb0be33ad74.png">

## カラムの設定
それぞれのカラムの設定をします。ここでstringやintといったデータの型を選べるんですね。

<img width="1043" alt="スクリーンショット 2016-11-30 9.43.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/25877829-8b2e-6e9e-708d-39c97e755097.png">

## パーティションの設定
Athenaではパーティションという仮想カラムを設けることで、特定のカラム同士をグルーピングできるらしいです。詳しいことはこれから調べようと思います。

<img width="1028" alt="スクリーンショット 2016-11-30 9.51.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/d41271d6-08ab-90c0-50e3-e51520bf1a95.png">

## テーブルの作成
ここまでくればテーブルが作成されます。

<img width="1445" alt="スクリーンショット 2016-11-30 10.04.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/a2b233b8-d735-1c44-c5ac-831939f77503.png">

# 作成したテーブルで検索してみる
一応きちんと検索できるのか、いくつかクエリを試してみます。

```
select * from sample_table;
```

<img width="1054" alt="スクリーンショット 2016-11-30 10.09.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/4197378e-6b3b-7b69-71ca-6f853f9ca86b.png">

・・・やってみてわかることってありますよね。csvファイルにヘッダいらないのか。そういえば途中でヘッダ用意してたな。。。まぁとはいえ、無事検索はできました。（ちなみに型に合わないデータは表示されないんですね。idとagegはint型で定義していたので、検索結果が空になったようです）

# 所感
使ってみた感じとしては、かなり可能性を感じさせる使いやすさとレスポンスでした。これは期待ですよ！
他にもクエリの保存とか履歴とか色々と機能がありそうなので、またいじってみたいと思います。

## おまけ
もしテーブル作成時にこんな画面になったら、テーブル名とか疑ってみてください。うっかりテーブル名に「-」（ハイフン）を入れて作ろうとしてしまい、入力時には特にバリデーションで弾かれなかったので気づきませんでした。

<img width="1071" alt="スクリーンショット 2016-11-30 9.55.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/102769/37760b7e-d340-d2f4-bf9f-1223dfc4903b.png">

あとはいくつかリンク切れのページがあったりもしましたが、すぐに対応されるかと思います。


何はともあれ今後に期待です。