お手軽集計システムの構築

[UUUM Advent Calendar 2019](https://qiita.com/advent-calendar/2019/uuum) 9日目の記事です。

こんにちは、[@key___sn](https://twitter.com/key___sn)です。
今回は、システムユニットで利用している集計システムで使うサービスの紹介をしていきたいと思います。

# 

今は下記のようなサービスを利用しています。

# 利用しているサービス
## AWS S3
AWSのストレージサービス
これは結構利用している人も多いかと思います。
macのfinderでフォルダやファイルを作成・保存するように簡単にデータを格納・取得することができます。

## AWS Athena
S3にあるデータをSQLクエリで取得することができる。
スキャンするデータ量によって金額が変わる。

## AWS Glue
AthenaでS3に入ってるデータをクエリで取得できるように紐づける役割
データベースを作成して、S3に入ったデータに対してテーブル定義をする事ができます。

# 実際に使ってみる

`sample-qiita.csv`

| Day        | Video ID    | Channel ID  |  Title     | Views    |
|:-----------|:-----------:|:-----------:|:----------:|-----------:|
| 20191001   |    hogehoge | HOGEHOGE    | ○○やってみた!| 10   |
| 20191001   |    fugafuga | FUGAFUGA    | ○○について   | 40   |
| 20191002   |    hogehoge | HOGEHOGE    | ○○やってみた!| 20   |

## S3にデータを保存する
[AWS S3](https://s3.console.aws.amazon.com/s3/home)から「バケットの作成」（ここでは、「sample-qiita」）
作成したバケットをクリックして「アップロード」から上記のCSVファイルを選択してアップロードする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213965/b2ba1643-63b0-157c-65ca-04c2b2fc04e4.png)


↑こんな感じになればOK！

## GlueでAthenaとひもづける
[AWS Glue](https://ap-northeast-1.console.aws.amazon.com/glue/home)から「テーブルの追加」→「手動でのテーブルの追加」を押下する
<img width="791" alt="AWS_Glue_Console.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213965/f1797f21-92e3-ac4a-b5c3-4f6b0a5ea207.png">

次に読み込むS3の場所を指定する必要があるので、「データの場所」は自分のアカウントで指定されたパス(デフォルトのまま)。「インクルードパス」は右側のフォルダーアイコンを押下してsample-qiitaを指定。
「データ形式を選択」はCSVを選択。「区切り記号」はCommaを選択

スキーマの定義は↓こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213965/e94dd938-64c4-e8d8-e418-43170ccf82da.png)

これで作成しましょう。

最後にCSVの先頭の1行はいらないので、作成したテーブルのページから「テーブルの編集」を押下して下記のパラメータを追加しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213965/1feb8383-1b0c-5883-6616-9cec2e30983f.png)

これで「適用」を押下して、完成です。



## Athenaで設定する
[AWS Athena]から下記の画像のようにGlueの設定が反映されていることを確認したら、試しにクエリを実行してみます。「Preview table」を押すと10件のデータを取得してくれるので正しくデータが取れていることを確認してください。

<img width="789" alt="Athena.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213965/d0e0ffd2-dc43-6f84-1316-7950418ff450.png">
<img width="1194" alt="Athena.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213965/e3d22d7a-f160-8469-ebca-f2072302f230.png">


### 初めてAthenaを利用する場合
クエリ実行時の情報をS3に保存する必要があり、それ用のバケットを用意する必要があります。
右上にある「Settings」から下記の画像のようにとりあえず設定しておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213965/97cf0e7a-d34d-77ed-e273-e165d8fb20dc.png)


### 計算してみる
SQLできる人にとってはもうあとは好きにしてくださいって感じですが、試しに動画ID毎にViewsをまとめてみます。
クエリは

```
SELECT video_id,
         max(title) AS title,
         sum(views) AS total_views
FROM "sample-qiita"."video"
GROUP BY  video_id 
```

こんな感じで、出力結果は下記のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213965/483e1500-bfea-44b8-7a32-5b5377549c08.png)

注意点は、AthenaではSQL Query EngineにFacebookの開発したprestoを採用しています。
そのため、いつものSQLの書き方ではうまくいかない場合もあるかもしれません。
うまくいかない場合は下記のAWSのドキュメントに、採用しているprestoのバージョンとドキュメントが記載してあるので参考にしてください。
[DML クエリ、関数、および演算子 \- Amazon Athena](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/functions-operators-reference-section.html)