AWS Glue Studio に追加された5つのTransformを試してみた

## はじめに
こんにちは。株式会社ジールの@Shin-Nakamura224です。
先日(2023/1/30)、**AWS Glue Studio** のビジュアルETLに**5つの新しい変換**が追加されることが
発表されたので、紹介していきたいと思います。
また**Flatten**については使用例も紹介したいと思います。

https://aws.amazon.com/jp/about-aws/whats-new/2023/01/aws-glue-studio-visual-etl-5-new-transforms/


## 概要
追加されたのは、下記５つのTransformになります。
**Add identifier、Add UUID、Flatten、To timestamp、Format timestamp**

**・Add identifier**
データセットの各行に対して、**数値識別子(連番)** を割り当てます。

**・Add UUID**
データセットの各行に対して、**36文字の一意な文字列**を割り当てます。

**・Flatten**
データ内の入れ子構造体のフィールドを**平坦化**し、トップレベルのフィールドに変換します。
新しいフィールドは、それに到達する構造体フィールドの名前を前に付けたフィールド名を使用して、
**ドットで区切られた名前**が付けられます。

```:フラット化の例
{"items": { "item_id": 1, "item_name": "test"}}
→　{"items.item_id":1,"items.item_name": "items.test"}
```
**・To timestamp**
数値または文字列列のデータ型をタイムスタンプ型に変更して、保存することができます。
（※タイムゾーンの指定はできません）
**・Format timestamp**
Timestamp型のデータを文字列に変更して、保存することができます。
文字列の形式は、Sparkの日付構文やPythonの日付コード（全てではない）を使用して、
定義することができます。
```:yyyy-MM-dd'T'HH 形式で定義した場合
2023-02-15 15:00:00:00.0
→　2023-02-15T15
```
↓　Sparkの日付構文、Pythonの日付コード

https://spark.apache.org/docs/latest/sql-ref-datetime-pattern.html

https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes

処理可能なデータソースの形式（Glue Stadio）
・JSON
・CSV
・Parquet
・Apache Hudi
・Delta Lake

## 実践
追加された各Transformを試していきます。

### Add identifier
１．テストデータ(csv)をS3に準備します。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/43afdb8b-304f-ca35-8245-a6b87da5e8c1.png">

2.ジョブを作成して、Transformノードを追加します。
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/2c471a8f-d8b5-6a51-9c64-ce8032a8c4dd.png">

3.実行結果
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/743c0397-07af-810d-f7d8-8a96c4006f8f.png">

チェックを入れた場合
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/5c8840a2-0223-bad0-271a-bbf27c074cfb.png">

### Add UUID
１．テストデータ(csv)をS3に準備します。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/43afdb8b-304f-ca35-8245-a6b87da5e8c1.png">

2.ジョブを作成して、Transformノードを追加します。
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/ab95077a-4a3d-9204-bfef-b8a3681d5083.png">

3.実行結果
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/0856d255-231f-f90f-a6f7-e475afdbadf7.png">

### Flatten
１．テストデータ(json)をS3に準備します。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/435900ab-b2cc-d7cb-9248-ef716a73be6f.png">

2.ジョブを作成して、Transformノードを追加します。
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/752c460c-8d80-3cf0-7c74-6652bec23d61.png">



3.実行結果
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/9c504fce-2387-dc31-2871-cad476bcb80d.png">
上記設定で1を入力した場合
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/ac772bc6-4260-2333-e0a0-a21a803ff98b.png">

### To timestamp,Format timestamp
１．テストデータ(csv)をS3に準備します。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/075a6ce3-1238-507a-9a6d-d55339c31a92.png">

2.ジョブを作成して、Transformノードを追加します。

**To timestamp**
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/7d851d68-c6ad-3a10-80a6-6c5b637aa3b5.png">

**Format Timestamp**
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/58afac8c-fbd8-491b-67cc-40631a5faeed.png">

3.実行結果
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/0753984e-69a3-6c74-9aa5-6cbb166450d4.png">

## flattenの使用例
簡単にflattenの使用例を紹介したいと思います。
使用例は、以下の内容になります。

・Glue Stadio上でネストされているソースデータ（半構造化データのJSONファイル）を
フラット化して、Redshiftの構造化データに挿入
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/f30bc6fa-b582-c057-5ae6-30c4c324859c.png">

今回は非構造化データ(JSONファイル)をRedshift DBのテーブル（構造化データ）に挿入するために、
RedshiftのCOPYコマンド（RedshiftDBのテーブルに外部データをコピーする）を実行します。
実行するためには、元データとテーブルのカラム名を一致させる必要があるため、
データソース（ネストされているJSONファイル）にカラム名となるキーを準備する必要があるので、
Glue上でフラット化しました。





①②の手順については、
手順は上記のFlattenと同じなので、省略します。（ソースデータは上記のものと同じ）

元データ
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/435900ab-b2cc-d7cb-9248-ef716a73be6f.png">

フラット化されたデータ
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/9c504fce-2387-dc31-2871-cad476bcb80d.png">

③フラット化したデータをRedshift DBのテーブルに格納
（本記事の内容から逸脱するため、Redshift等の設定は省略させて頂きます。）
１．Redshiftクラスターのクエリエディタv2を使用して、テーブルを作成します。
（※コピー元データのカラム名と同じカラム名でないと、copyしてもnull値が挿入されます）
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/94a45fe3-db66-db09-c902-d5459eb1bb34.png">

2.RedshiftのCOPYコマンドを使用して、S3のデータをRedshiftのテーブルへコピーします。
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/33279b09-2211-e698-e5c6-7f3b88a81f67.png">


3.select文で確認
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3120637/6814fe64-c7ca-4459-22bb-7359878e9c83.png">

## まとめ
今回追加されたTransformは以下の５つになります。
・Add identifier
・Add UUID
・Flatten
・To timestamp
・Format timestamp

**Flatten**については、
上記の使用例（半構造化➡構造化）やログデータ等のフラット化に使えそうなので、
便利な機能だと感じました。

この記事が少しでも皆様のお役に立てれば幸いです。

## 参考サイト
https://aws.amazon.com/jp/about-aws/whats-new/2023/01/aws-glue-studio-visual-etl-5-new-transforms/

https://docs.aws.amazon.com/glue/latest/ug/edit-jobs-transforms.html