【AWS】【CodeCatalyst】ブループリントのAWS Glue ETLをやってみた+α

# TL;DR

- CodeCatalystのblueprintの中から"AWS Glue ETL"をやってみた
- CSVファイルとParquetファイルの両方でAthenaのクエリを実行してみた
    - Parquetは列指向だから特定の列の扱い(集計など)に強い
    - 逆に、全情報を取ってくるならCSVの方が早い

# CodeCatalystのblueprint "AWS Glue ETL"

- CodeCatalystにはblueprintという便利なサンプルプロジェクトをいくつか提供してくれます
    - [Project blueprint reference](https://docs.aws.amazon.com/codecatalyst/latest/userguide/projects-templates.html)
- その中で今回は"AWS Glue ETL"というテーマを体験しました
    - アーキテクチャと使い方の流れは以下の通りです
1． S3バケットにCSVファイルをアップロード
2． Lambdaがキックされ、その中でGlue Jobを実行する
3． Glue JobはCSVファイルをParquetファイルに変換し、別ファイルとしてS3にアップロードする
4． 自分でAthenaを操作してParquetファイルに対してSQLクエリを実行
![スクリーンショット 2023-09-08 1.45.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079261/b104d944-e099-5243-ab58-16438b268e8d.png)

- CodeCatalystはCDKを使ったデプロイパイプラインを自動で提供してくれるので本当に便利ですよね！
![スクリーンショット 2023-09-08 1.47.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079261/361d0d99-8908-a024-686c-e3069658479d.png)

# Athenaでクエリしてみた

![スクリーンショット 2023-09-08 2.04.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079261/9e0f1fce-5544-bb6f-4533-3c6defa991e0.png)
※このSQLもblueprintの中でGlue WorkGroupとしてデプロイされていますのでご安心を

![スクリーンショット 2023-09-08 2.03.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079261/dd95a09f-fa25-7489-5126-1e8ff696c8c6.png)
※512ミリ秒

- ここで気になったことは、変換前のCSVと変換後のParquetでパフォーマンス比較したらどうなるのか？ということです
    - blueprintの中のサンプルCSVファイルの中身は265件だけです
    - パフォーマンスの差を確認するために以下のような簡単なプログラムを用意しましたのでご参考ください

```python
import csv

with open('output.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file, quoting=csv.QUOTE_NONNUMERIC)
    
    # ヘッダー行を書き込む
    writer.writerow(["LocationID", "Borough", "Zone", "service_zone"])
    
    # 1万件のデータ行をループで作成して書き込む
    for i in range(1, 10001):
        location_id = i
        borough = f'Borough{i}'
        zone = f'Zone{i}'
        service_zone = f'service_zone{i}'
        
        writer.writerow([location_id, borough, zone, service_zone])

```

# 1万件で比較してみた

- ちなみに、CSVファイルクエリ用のGlue TableはGlue Crawlerを使って作りました
    - (これはもちろん手動です、初めてなので手探りでした･･･)

![スクリーンショット 2023-09-08 2.42.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079261/3c5b73c1-e8f1-eb34-61bc-5d22b97ff233.png)
※Parquetファイルの結果

![スクリーンショット 2023-09-08 2.44.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079261/fb4129d7-c1ba-fbd8-56d4-bd794f6e3dd5.png)
※CSVファイルの結果

- CSVの方が早いぞ！！
    - (それもそのはず、実行しているSQLが｢SELECT * 〜｣だからParquetの強みが活かせてない)

# 10万件で比較してみた

![スクリーンショット 2023-09-08 2.52.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079261/6288d0cc-b463-f882-5d20-db63dbe8a15a.png)
※Parquetファイルの結果

![スクリーンショット 2023-09-08 2.53.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079261/44e996e6-88a0-777f-3a17-f2efc21a14d9.png)
※CSVファイルの結果

- お〜、どんどん差が出ますな〜(感心)

# ここで満を持して集計関数で比較してみた

- ｢SELECT **SUM(CAST(LocationID AS bigint))** FROM 〜｣というように、LocationID列の値の合計を出力

![スクリーンショット 2023-09-08 3.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079261/aa0ed53e-eda9-3c81-bdbd-f5230c3607d2.png)
※Parquetファイルの結果

![スクリーンショット 2023-09-08 3.10.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079261/19dc3ac8-212e-9c47-20f5-a5c0b19c1500.png)
※CSVファイルの結果

- ちゃんとParquetの方がパフォーマンスが良い！！
- (ちなみに、ファイルサイズもParquetの方が小さいのでストレージ容量、費用の削減にもなります)

# まとめ

- CodeCatalystはやっぱり便利だし、他のblueprintも試していきたいしぜひ皆さんにもおすすめしたい
- Parquetの理解が浅かった･･･
- GlueやAthenaを使ったことなく、今回を気に勉強ができた

# Appendix

- S3バケットへのオブジェクト登録でキックされるLambdaの設定を一部手動で変更しました
    - 変更箇所：｢Suffixに.csv｣ではなく、｢Prefixにcsv-input/｣
    - 変更理由：Athenaのクエリ実行結果が同じバケットにアップロードされ、そのせいでキックされることを防ぐため
        - PrefixとSuffixの併用は仕様上不可

![スクリーンショット 2023-09-08 3.23.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079261/f016ae2f-85b0-98f5-10b3-ed2bad32f57b.png)


![スクリーンショット 2023-09-08 3.15.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1079261/f322baa8-9139-0d9d-b9e5-ffe7c29cdb13.png)