Glueでcsvファイルをparquet形式に変換してみた


AWS DASの勉強で初めてGlueを触ったのでメモ

## Parquet形式とは
[AWSドキュメント](https://docs.aws.amazon.com/ja_jp/athena/latest/ug/columnar-storage.html)より
>Apache Parquet や ORC は、データを高速に取得できるように最適化された、AWS 分析アプリケーションで使用されている、列指向ストレージ形式です。
>列指向ストレージ形式には以下の特性があるため、Athena での使用に適しています。
>列のデータ型に合わせて選択された圧縮アルゴリズムによる列ごとの圧縮で、Amazon S3 のストレージ領域を節約し、ディスク容量とクエリの処理中における I/O を削減します。
>Parquet および ORC での述語プッシュダウンにより、Athena クエリが必要なブロックのみを取得できるようになり、クエリパフォーマンスが向上します。Athena クエリがデータから特定の列値を取得すると、データブロック述語からの統計 (最大値や最小値など) を使用して、そのブロックを読み取るかスキップするかを判断します。
>Parquet および ORC でのデータの分割により、Athena がデータの読み取りを複数のリーダーに分割して、クエリ処理時における並列化を向上させることが可能になります。

ざっくりまとめると以下のメリットがあリます。
・`select id from ~`のような列を指定したクエリが効率良く実行可能。
・列のデータ型に合わせて列ごとに圧縮するので、色々なデータ型を含む行指向と比較して保存の圧縮効率が良い。

上記から、分析用途ならparquetなど列指向のファイルに変換した方が都合が良いということでした。

# parquetへの変換
以下の流れでparquetファイルを作成します。

1. 変換元となるサンプルcsvをS3に格納
2. csv→parquet変換用のGlueJobを作成
3. Job実行
### 変換元となるサンプルcsvをS3に格納

以下のサイトで10万行のサンプルデータを生成します。
https://tm-webtools.com/Tools/TestData
![スクリーンショット 2023-02-05 13.03.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/48f47191-8e1e-2db1-4bf5-e55754bb7f4e.png)
このサンプルデータはS3に格納しておきます。

### csv→parquet変換用のGlueを作成
Glue画面の[Data Integration and ETL] - [Jobs]からGlueジョブを作成していきます。

#### ジョブ全体像
![スクリーンショット 2023-01-22 22.29.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/dccfbd90-7e75-ae16-88c1-dc75bd2294f3.png)

#### Data source
サンプルファイルにヘッダー行が入っている為、`First line of source file contains column headers`にチェックを入れます。
![スクリーンショット 2023-02-03 22.57.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/221f2093-0480-409d-d60f-5148069f3875.png)

Data previewを開くと、CSVの中身が表示されます。
理由は分かっていないですが、nameがundefinednameになっていました。。
![スクリーンショット 2023-02-03 23.18.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/9b45e4c9-d70b-6352-b101-ff2d2b4a4959.png)

Output schemaのEditから修正出来そうでしたが、後続のTransformで対応します。
![スクリーンショット 2023-02-03 23.51.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/c24e4a08-eabb-52dc-a57b-6704dce9c7ec.png)

#### Transform
以下を変更しました。
・undefinednameをnameへ変更
・ageをint型へ変更
![スクリーンショット 2023-02-03 23.52.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/b23bfc42-4a2d-c982-0a80-340663a5ef1b.png)

Output schemaは想定通りです。
![スクリーンショット 2023-02-03 23.55.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/7ac46609-f1d5-3fd9-73ed-a06c7e747849.png)

#### Data target
ここで出力形式にParquetを選択します。
テストなので圧縮・データカタログは無しとしました。
隠していますがS3バケットに出力するようにしています。
![スクリーンショット 2023-02-03 23.57.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/6a4b65c2-a351-c310-c8c8-30f2000c33c3.png)

Data Previewが表示されませんでしたが、とりあえず先に進みます。
![スクリーンショット 2023-02-04 0.00.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/2373e175-46de-16b1-238b-4b7a67933f62.png)

Output schemaは想定通りです。
![スクリーンショット 2023-02-04 0.01.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/b19569ea-8ace-55c9-7f17-e66dfe04bdca.png)

ここまででJob設定は完了です。

### Glue実行
作成したJob画面右上のRunから実行します。
Jobの状況はRunsタブから確認が可能です。
![スクリーンショット 2023-02-04 0.04.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/fe9b32ee-765c-8b04-dff4-1282a6d85ae4.png)

Job成功後、出力先に設定したS3にparquetファイルが出力されていました。
![スクリーンショット 2023-02-04 0.13.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/35e5c4a7-59a7-4d9d-8c3e-ec35e9e35689.png)

最後にファイルの中身を見てみます。
このままS3 Selectを使用しても良いのですが、料金を気にしたくないのでローカルで参照します。
調べたところVSCodeの拡張機能かCLIが気軽に使えそうで、今回はCLIにしました。

いくつかコマンドを打ったところ。
![スクリーンショット 2023-02-04 0.35.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/0d543613-f5c9-28fb-a4c9-b29e22fd7343.png)
![スクリーンショット 2023-02-04 0.35.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/6c9c8919-4e3e-b770-e8aa-4ca15791065e.png)
![スクリーンショット 2023-02-04 0.36.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482308/9ab965ab-a000-737a-f1f9-d7767ea278a9.png)

一旦スルーしてしまった箇所もありますが、ひとまずやりたいことは出来ました。
metaコマンドでカラムごとにmin/max値が表示されるのが面白かったです。

## 参考記事
parquet-cliのインストール・使用方法
https://kakakakakku.hatenablog.com/entry/2022/12/12/094113