Amazon Athenaの練習

# はじめに
Amazon AthenaはS3に保存したファイルにクエリを実行するサービスです。データベースに入れて本格的にDWHする前にお試し分析をしたり、使用頻度の少ないデータをコスパに優れたS3で分析するために利用します。
# 内容

CSVのファイルを用意してAthenaでクエリを作ります。 

## 元データの準備
[厚生労働省のサイト](https://www.mhlw.go.jp/stf/covid-19/open-data.html)にある下記のようなPCR検査実績人数データをダウンロードして利用することにします。

```csv:pcr_tested_daily.csv
日付,PCR 検査実施件数(単日)
2020/2/5,4
2020/2/6,19
2020/2/7,9
2020/2/8,4
2020/2/9,10
2020/2/10,12
以下省略
```

ダウンロードしたcsvファイルをそのままS3に作成したバケットのフォルダにアップロードします。今回は```s3://lake-talomina/pcr_tested_daily/```というフォルダを利用することにします。

## Athenaの設定
* AWSでAthenaを開くと下記のような画面が出てくるので「今すぐ始める」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/9837c254-814f-33db-529d-53b9228ba991.png)
* Athenaのクエリエディタの画面が開くので、まずは「設定」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/cd017c92-41c8-67ae-da20-757affbff265.png)
* クエリ結果の場所を指定します。ここは適当なS3のフォルダを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/f5b3064d-2313-dbc2-5594-226d5c3bb587.png)

## テーブルの作成
* クエリエディタの左側ペインから「テーブルの作成」をクリックして、データソース「S3バケットデータから」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/7e7cdbef-b269-7085-521b-3f7ae8adfff9.png)

* ステップ1で新しいデータベースを選択し、[データベース名]と[テーブル名]を入力します。[入力データセットの場所]にはS3バケットの対象フォルダのURIを入れます。バケットを暗号化している場合は[暗号化]のチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/28b78132-53f0-7fde-2eb8-35b58947e816.png)
* ステップ2は今回のデータ形式である「CSV」を選択します。
* ステップ3はカラムの定義です。CSVのカラム定義を入れます。列名と列のタイプを設定します。
* ステップ4でパーティションの設定ができますが、今回は行わず、「テーブルの作成」をクリックします。ただ、実際にデータを扱う際にはデータの読込量で課金されるため、しっかりパーティション設定をして必要な行だけ読みに行くようにしたほうがパフォーマンスもコストも良いと思われます。
* クエリエディタで下記のようなSQLが表示されて「クエリは成功しました。」と表示されれば成功です。（最後の一行だけヘッダ行を読み飛ばすように書き換えてあります。）

```SQL:
CREATE EXTERNAL TABLE IF NOT EXISTS covid19datas.pcr_daily (
  `tested_date` string,
  `tested_number` bigint 
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = ',',
  'field.delim' = ','
) LOCATION 's3://lake-talomina/pcr_tested_daily/'
TBLPROPERTIES ('has_encrypted_data'='true'
               ,'skip.header.line.count'='1');
```
* クエリエディタでテーブル名の横の「・・・」をクリックしてテーブルのプレビューを押すとテーブルの中身を見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/e113e1ed-08c0-4b4c-8fbd-5082018ff124.png)

## ビューの作成
日付の部分がstring型では扱い辛いので、```/```で項目を分割するビューを作ってみます。
* まずクエリエディタで下記のようなクエリを作成して実行します。

```SQL:
SELECT
split_part(tested_date, '/', 1) as tested_year
,split_part(tested_date, '/', 2) as tested_month
,split_part(tested_date, '/', 3) as tested_day
,tested_number![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/6b775c16-ae3e-ec36-3b1b-5405ee622be3.png)

FROM "covid19datas"."pcr_daily";
```

* うまくクエリが実行できたら、下にある[作成]ボタンから[クエリからビューを作成]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/008b0b4c-5ee6-0a18-af28-287ce0b5dbea.png)


* ビュー名をインプットするとビューが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/7d8ca9d5-7624-d07b-70f0-d2d3ae8333d7.png)

## データの利用例 PCR検査数を月ごとに集計する
* 下記のようなクエリを作成しました。

```SQL:
SELECT
tested_year
,tested_month
,sum(tested_number) as pcr_number_sum
FROM "covid19datas"."pcr_dairy_ymd"
group by tested_year,tested_month
order by tested_year,cast(tested_month as bigint);
```

* 表示されました

| tested_year | tested_month | pcr_number_sum |
|:-:|:-:|:-:|
|2020|2|1560|
|2020|3|30314|
|2020|4|114333|
|2020|5|123017|
|2020|6|120995|
|2020|7|314162|
|2020|8|617602|
|2020|9|567450|
|2020|10|549725|
|2020|11|773617|
|2020|12|1273942|
|2021|1|1883481|
|2021|2|1364325|
|2021|3|1551196|
|2021|4|1933709|
|2021|5|2497052|
|2021|6|1803057|

# おわりに
とりあえずCSVに対して直接SQLを実行することはできるようになりました。
AthenaのテーブルやビューはQuicksightのソースに使ったりGlueでさらにETLすることもできるようです。日付をもっと簡単にDate型で扱えるといいのですが。

# 参考文献
* https://dev.classmethod.jp/articles/tsnote-support-athena-error-query-launch-001/
* https://qiita.com/yoshiyama_hana/items/9b2f26b214de92a0f36c
* https://qiita.com/sh_tomato/items/97c33cea9bed5a23dd9e

## おまけ
あとあと気づいたのですがGlueのデータカタログの中にAthenaで作ったデータセットが入っていました。AthenaはS3向けのGlueということか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/940466/aa2608c0-f6ff-ade6-415e-73d31a34a416.png)