Amazon Athena+AWS Glue のベストプラクティス を学ぼう #1

# はじめに
本記事は、AWSの公式ドキュメント[Athena と AWS Glue を併用する際のベストプラクティス](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/glue-best-practices.html)を参考に、Athena、Glue間のデータ連携について検証する記事になります。

わかりにくいワードを記事最後尾にまとめております。記事の目次から各ワードの解説へ飛べます。
読んでいる途中でわからないワードがあったら、目次から探してみてください。

本記事は数部にわたり、投稿してまいります。
投稿した記事を順次、以下に追記してまいります。
今回はまず、ベストプラクティスを学ぶ前にGlueとAthenaを触ってみる回になります。ベストプラクティスについては#2で学んでまいります。

# Amazon Athenaとは
AWSの提供するインタラクティブなクエリサービスです。Amazon S3 内のデータを標準 SQL を使用して簡単に分析できます。

# AWS Glueとは
AWSの提供するフルマネージド型のETLサービスで、分析用データの準備とロードを簡単にします。
AWS に保存されたデータを指定するだけで AWS Glue によるデータ検索が行われ、テーブル定義やスキーマなどの関連するメタデータが AWS Glue データカタログに保存されます。
カタログに保存されると、データはすぐに検索かつクエリ可能になり、ETL に使用できるようになります。

# なぜAthena、Glueを併用するのか
Athena と AWS Glue データカタログを併用すると、AWS Glue で作成したデータベースとテーブル (スキーマ) を Athena でクエリしたり、Athena で作成したスキーマを AWS Glue や関連サービスで使用したりできます。

# AWS Glue データカタログにメタデータを登録
SIGNATEに掲載されているお弁当需要予測のtrain.csvを利用して、AWS Glueデータカタログにメタデータを登録します。
まず、任意のS3バケットにcsvファイルをアップロードします。
私は以下のパスにアップロードしました。

```
s3://バケット名/test/train.csv
```

次にクローラを追加します。
AWSコンソール上でAWS Glueを開き、左の項目からクローラをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/08a592b9-8e9b-bf41-9c88-5ac403446db7.png)

クローラの追加をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/6aabdd7f-0004-1566-c2c9-23fd853c0de5.png)

クローラに名前を付けます。
任意の名前を入力して、次へをクリックします。
私は、test-obento と入力しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/0c1173bc-683c-80cf-3637-3fc19f1a0d9a.png)

クローラのデータソースを指定します。
今回はデータストア(S3)を利用するので、Data storesを選択して、次へをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/117a59f7-0218-5044-5868-c90be67e3b15.png)



データソースの詳細設定をします。
データストアはS3で自分のアカウントで指定されたパスを選択します。
インクルードパスには、アップロードしたcsvファイルのあるフォルダを選択します。
私の場合はs3://バケット名/test/となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/f675bdd4-c323-3a27-80e8-9fb3db068fc3.png)

他に追加したいデータストアがある場合は追加できます。
今回はいいえを選択し、次へをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/1971cf82-0d8e-72c6-1c5f-dc545bd1c7cf.png)


IAMロールの選択、作成を行います。
今回、私はIAMロールを作成しました。
IAMロールに任意の名前を入力して次へをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/033dde36-2039-e4dc-c6f2-5af162dcff00.png)

次にクローラのスケジュールを設定します。
実際に業務で使う場合は、メタデータの更新、追加があるので定期的にクローラを実行しメタデータの更新を反映します。
今回は一度読み込むだけなので、オンデマンドで実行を選択し、次へをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/286c5ce4-6f3f-2ba4-495a-061064dce8da.png)

次にクローラの出力設定をします。
データベースは作成していないので、データベースの追加から新たにデータベースを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/a89d9412-d306-6b68-acfa-aa8f2eff1ff6.png)

任意のデータベース名を入力してください。
私は、testとしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/ea695812-0d01-72d7-c6e5-20e524edea30.png)

作成したデータベースが選択されていることを確認し、次へをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/af63d0fa-58db-5961-8f5f-566f45e419ac.png)

内容を確認し、完了をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/8265513e-a551-f409-1a5e-753c0509ee83.png)

クローラが作成されると画面上部に今すぐ実行しますかと出てくるので、クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/6f3cc92f-3d63-f120-d062-007762c10f83.png)

クローラが実行され、完了すると以下のようにステータスがStoppingとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/3ef876e9-c3f6-3e24-d3e4-945c4e4a20f1.png)

左の項目から、テーブルを選択し、作成されたテーブルをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/e9c64065-ee16-e431-59c1-7064945fcb86.png)

すると以下のようにAWS Glueデータカタログに登録されたテーブルのメタデータが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/671e5b8c-b4ac-c7d9-e2e4-509764b44858.png)

# AWS Glueデータカタログに登録されたデータを元に Amazon Athena でクエリを実行
早速、データカタログに登録されたデータを利用して、Athenaでクエリを実行します。
まず、AWSコンソール上でAmazon Athenaを開きます。
最初に、クエリの実行結果の保存先を指定する必要があります。
画面右上の設定をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/ea60beb0-ed50-a87e-3bf5-f208d70dc1f6.png)

出力先となるS3パスを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/6c4ed567-3253-6f54-cb4d-d5301dbd9c6d.png)

では試しに、登録したデータをクエリで抽出してみます。
以下のコードを実行します。
これでテーブルを全て抽出します。

```
select * from "テーブル名"
```

すると以下のように実行結果が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/0dc7f04b-bc62-69b8-ee3f-4641cc2b7e63.png)

先ほど設定した出力先にも、クエリ結果が保存されているので確認してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/491ca5e1-90d0-389c-2459-286faa73f489.png)

正しく出力されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390035/0c134f6d-d474-d229-b025-4e381314cbb0.png)

#終わりに
今回はベストプラクティスを学ぶ前段として、Athena、Glueを利用してみました。
次回からは、ベストプラクティスに沿ってAthena+Glueを学んでいきます。
どうぞよろしくお願いいたします。

#用語解説
##### インタラクティブ  
- 双方向、対話型という意味  
例えば、スマホで何かを検索するとします。  
検索バーにワードを打ち込んで検索をかけると検索結果が返ってきます。  
これは、送信側である私たちのこれが調べたいというリクエストに対して、それを受信したブラウザが検索結果はこれですよと応答してくれています。
これが対話型、インタラクティブな通信といえます。

##### クエリ
- データベースのデータを操作、抽出する際に送る処理要求(命令)

##### SQL
- リレーショナルデータベースのデータを操作したり、定義するためのプログラミング言語  
SQLで書いた、SQL文がクエリにあたります。

##### リレーショナルデータベース(RDB)
- 事前に定義された表形式のデータベース  
1個以上の列と0個以上の行によって構成される表形式のデータベースで、RDB上で行う様々な操作の結果も表形式で表現されます。  
RDBでは、個々の表は必要最小限の情報のみを保持するように設計し、SQLによって各表の選択結合等を行いデータを取り出します。  
例えば、以下のように商品と売り上げのテーブルをRDB上に定義するとします。

商品マスターテーブル

| 商品番号       |       商品名 |単価|
|-----------------:|------------------:|------------------:|
|0001|商品A|¥ 100|
|0002|商品B|¥ 200|

売り上げテーブル

|注文日| 商品番号|個数|
|-----------------:|-----------------:|------------------:|
|1/1|0001|2|
|1/2|0002|3|

ここで、売り上げと商品情報を同時に得たいという場合には、SQLで結合、計算等を行うことで、以下のような出力が得られます。

| 商品番号       |       商品名 |注文日|単価|個数|小計|
|-----------------:|------------------:|------------------:|------------------:|------------------:|------------------:|
|0001|商品A|1/1|¥ 100|2|¥ 200|
|0002|商品B|1/2|¥ 200|3|¥ 600|

##### フルマネージド型サービス
- 事業者によって内容は異なりますが、その多くは対象のサービスの24時間365日監視や障害発生時の復旧作業を事業者が提供することを指す

##### ETL(Extract/Transform/Load)
- データベースなどから、データを抽出(Extract)、必要に応じて変換(Transform)、変換済みのデータを格納先にロード(Load)することを指す

##### テーブル定義
- テーブルの詳細情報のことで、どのようなカラムが存在して、各カラムの属性は何かを定義している情報


##### スキーマ
- データベースの構造  
データベースによってスキーマの定義が違い、スキーマのないデータベースもあります。


##### メタデータ
- データに関するデータ  
こちらも場合によって、定義が違います。  
よくある例としては、作成者、ユーザー名、編集者、作成日、更新日、保存場所、サイズのようなデータが該当します。



##### AWS Glue データカタログ
- データの場所、スキーマ、およびランタイムメトリクスへのインデックス
ETL ジョブを作成するために、Glueが参照するカタログでメタデータとして保存されています。

##### クローラ
- 指定したデータ群のメタデータを調査してAWS Glueデータカタログに追加するもの