0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

TL;DR

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

CodeCatalystのblueprint "AWS Glue ETL"

  • CodeCatalystにはblueprintという便利なサンプルプロジェクトをいくつか提供してくれます

  • その中で今回は"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
  • CodeCatalystはCDKを使ったデプロイパイプラインを自動で提供してくれるので本当に便利ですよね!
    スクリーンショット 2023-09-08 1.47.13.png

Athenaでクエリしてみた

スクリーンショット 2023-09-08 2.04.14.png
※このSQLもblueprintの中でGlue WorkGroupとしてデプロイされていますのでご安心を

スクリーンショット 2023-09-08 2.03.44.png
※512ミリ秒

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

スクリーンショット 2023-09-08 2.44.23.png
※CSVファイルの結果

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

10万件で比較してみた

スクリーンショット 2023-09-08 2.52.52.png
※Parquetファイルの結果

スクリーンショット 2023-09-08 2.53.49.png
※CSVファイルの結果

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

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

  • 「SELECT SUM(CAST(LocationID AS bigint)) FROM 〜」というように、LocationID列の値の合計を出力

スクリーンショット 2023-09-08 3.10.00.png
※Parquetファイルの結果

スクリーンショット 2023-09-08 3.10.47.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

スクリーンショット 2023-09-08 3.15.37.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?