FirehoseでParquetに変換してAthenaで分析してみた

# はじめに
S3の保管方法によってAthenaのクエリ効率が変わるのは何となく知っていましたが、保管形式によっても大きく変わってくるんですね。
今回はCSVで吐き出されるファイルをParquetに変換してS3に保管して、効率良くAthenaで分析したいといった要望に対して検証したことをまとめます
Athenaのパフォーマンスとファイル形式については以下サイトをご参考に、、
[Amazon Athena のパフォーマンスチューニング Tips トップ 10](https://aws.amazon.com/jp/blogs/news/top-10-performance-tuning-tips-for-amazon-athena/)

# アーキテクチャ
ざっくりこんな感じです。
FirehoseでParquetに変換するためにGlueが必要なんですね。（初耳学）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/1f7d737b-3d65-f02b-d92b-ae6d76d1aeec.png)

# 検証開始
以下手順で作成していきます
1. Kinesis Data Firehoseの作成
1. Glue Databeseの作成
1. Kinesis Data Firehoseの作成続き
1. Firehose⇒S3のデータ転送テスト
1. Glue Crawlerの設定
1. Athenaでクエリを投げてみる

## 1. Kinesis Data Firehoseの作成
「Kinesisストリームを作成」からパッと作成しちゃいます。

![スクリーンショット 2024-05-27 144223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/c7cba116-4892-3ccf-5b1e-5d652c8087ee.png)

「レコードを変換および転換」で「レコード形式の変換を有効にする」にチェックを入れます。
すると、AWS Glueのデータベースとテーブルを選択しろと言われます。。

![スクリーンショット 2024-05-27 144306.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/1806350b-c665-94f2-554f-4cb80f2fa027.png)

## 2. Glue Databeseの作成
ここで作成したDatabaseとTableを1.で作成したFirehoseに設定します。
### Glue Databaseの作成
「Glue」→「Database」→「Add database」から作成できます。
名前はご自由に～

![スクリーンショット 2024-05-27 144405.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/151e49f4-8e90-b930-039e-cf68f6f87fd8.png)

### Tableの作成
「Table」から作成できます。フォーマットはデフォルトのモノでOK
保管先にはS3を選択し、各々保管先のS3を指定します。

![スクリーンショット 2024-05-27 144501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/e00d4d41-88de-d780-3d30-8619fdf394ae.png)
![スクリーンショット 2024-05-27 144522.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/71bce08b-dd7a-c4ea-e4b1-71e427386baf.png)

一旦Shemaの設定は不要です。
作成完了したらFirehoseに設定しちゃいます。
![スクリーンショット 2024-05-27 144542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/d14713ee-1d25-cd86-2cc5-95da8a07add1.png)

## 3. Kinesis Data Firehoseの作成続き
Athenaでクエリ投げるところまでを検証するので、S3のプレフィックスも設定しておきます。
（参考：[Amazon S3 オブジェクトのカスタムプレフィックス](https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/s3-prefixes.html)）

![スクリーンショット 2024-05-27 144713.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/472307cb-556b-a976-f529-4e0f58f62fe7.png)

## 4. Firehose⇒S3のデータ転送テスト
Firehoseにはデモデータをストリームに配置することでテストすることが可能です。
「デモデータの送信を開始」をクリックするとデータがFirehose経由でS3に格納されます。

![スクリーンショット 2024-05-27 144810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/47527e1b-044a-98e5-5f03-d5bafcf0ef76.png)

Firehoseで設定したプレフィックスでデータが格納されます。
さらにParquet形式に変換されていますね。
![スクリーンショット 2024-05-27 144848.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/f5bcdc81-01fd-8bc3-04c9-e111b8833883.png)

## 5. Glue Crawlerの設定
先ほど無視したShemaを設定するためにCrawlerを設定します。

![スクリーンショット 2024-05-27 144925.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/89161ade-24ba-e2ed-f889-f7986cb4870c.png)

Data Sourceは各々のS3のパスを設定しましょう。
自分の場合"s3://backet/firehose"になります。

![スクリーンショット 2024-05-27 145003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/3fcddb6c-4ce1-b8c9-2a35-5cf1a9af0b1a.png)

ETL用に新しいDatabaseを作成してTargetにしました。

![スクリーンショット 2024-05-27 145118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/145c91a2-bad7-fbd2-10c9-fe794070ef00.png)

Crawlerを実行させます。

![スクリーンショット 2024-05-27 145153.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/df617b1c-9d93-c2e5-78d1-2a509269b180.png)

Shemaが設定されたGlue Databaseの完成です。

![スクリーンショット 2024-05-27 145234.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/6e27ae38-062f-8885-65ec-c2b0cfd10153.png)

## 6. Athenaでクエリを投げてみる
投げてみました。

![スクリーンショット 2024-05-27 145302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/96b0a44a-26b0-51b0-ebe3-da64a0784ca9.png)

こんな感じで見られます。

![スクリーンショット 2024-05-27 145318.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/0f358904-725d-9f04-ecf1-8f5b81a2aedb.png)

# おわり
ここからQuickSightを使った見える化なども考えていけるかと。
データ分析基盤の構築はやってみると色々考慮事項があって大変だなあ、