AWS Glue Studio に追加になったTransformを試してみた - 202302

# 背景・目的
[AWS Glue Studio Visual ETL now supports 5 new transforms](https://aws.amazon.com/jp/about-aws/whats-new/2023/01/aws-glue-studio-visual-etl-5-new-transforms/)のとおり、Glue Visual Studioで5つのTransformが追加になったので試してみます。

# まとめ
- Glue Studioに5つのTransformが追加されました。
    - Identifier
    - UUID
    - flatten
    - Format timestamp
    - To timestamp

# 概要
今回追加になったのは、下記のTransformです。いずれも新しいカラムを追加できる機能のようです。
- Identifier
    - データセットの各行に数値識別子を割り当てる。
- UUID
    - UUID (Universally Unique Identified) 列を追加すると、各行に一意の 36 文字の文字列が割り当てられる。
- flatten
    - データ内のネストされた構造体のフィールドをフラット化して、それらがトップレベルのフィールドになるように変換する。
    - 新しいフィールドは、それに到達する構造体フィールドの名前を前に付けたフィールド名を使用して、ドットで区切られた名前が付けられます。
    - 例を下記に記載する。
        ```
        {phone_numbers:{country_code,number}}
        ↓
        {phone_numbers.home_phone.country_code,phone_numbers.home_phone.number}
        ```
- Format timestamp
    - タイムスタンプ列をパターンに基づいて文字列にフォーマットする。 日付と時刻を目的の形式の文字列として取得できる。 
    - 形式は、Spark の日付構文とほとんどの Python 日付コードを使用して定義可能とのこと。
    - 例えば`2023-01-01 00:00`のように変換するには、`yyyy-MM-dd HH:mm`を指定する。
- To timestamp
    - 数値列または文字列列のデータ型をタイムスタンプに変更し、そのデータ型で格納したり、タイムスタンプを必要とする他の変換に適用したりできる。

# 実践
追加になったTransformについて試してみます。

## 前準備
下記のようなテストデータをS3バケットに配置しておきます。
```
$ aws s3 cp  s3://{バケット名}/input/transform.json - | jq
{
  "order_id": "00001",
  "org_created_on": 1675414800,
  "org_updated_on": 1675384053,
  "goods": {
    "goods_id": "g-00001",
    "price": "1000"
  }
}
$

```

## Transformを追加
下記のように5種類のTransformを追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3174018f-dc04-e6c0-94b7-1c53c7f026a6.png)

設定値は下記のとおりです。
| Transform | 新しいカラム名| 備考 |
|:--|:--|:--|
| identifier |added_id | |
| UUID| added_uuid ||
| Flatten| | |
| to timestamp| converted_updated_on| Column typeは「autodetect」を指定しています。|
| format| converted_created_on | ・timestamp型に変換した、「timestamp_created_on」をインプットにしています。<BR>・formatは`yyyy-MM-dd'T'HH:mm:ss.SSSZ`としています。|


## 実行確認
1. ジョブを実行しました。Succeededになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/185afb7f-5478-0a2e-8c52-fa30c73880ab.png)

1. outputバケットにそれぞれファイルが作成されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b818d26b-8c48-ec8a-c2e2-af0d8947f1dc.png)

1.作成されたファイルの内容を確認します。

### Identifier
- 行末に0から始まるIDが追加されています。
```
$ aws s3 cp s3://{バケット名}/output/identifier/run-1675387477729-part-r-00000 - | jq                
{
  "order_id": "00001",
  "org_created_on": 1675414800,
  "org_updated_on": 1675384053,
  "goods": {
    "goods_id": "g-00001",
    "price": "1000"
  },
  "added_id": 0
}
$ 
```

### UUID
- 行末にUUIDが追加されています。
```
$ aws s3 cp s3://{バケット名}/output/uuid/run-1675387486264-part-r-00000 - | jq
{
  "order_id": "00001",
  "org_created_on": 1675414800,
  "org_updated_on": 1675384053,
  "goods": {
    "goods_id": "g-00001",
    "price": "1000"
  },
  "added_uuid": "b59548c9-461f-4a52-904f-ccd0d6c4c9c0"
}
$

```

### Flatten
- ネストされたgoods->priceとgoods_idがドット（.）形式に変換されています。
```
$ aws s3 cp s3://{バケット名}/output/flatten/run-1675387468148-part-r-00000 - | jq
{
  "order_id": "00001",
  "org_created_on": 1675414800,
  "org_updated_on": 1675384053,
  "goods.goods_id": "g-00001",
  "goods.price": "1000"
}
$
```

### To timestamp
- UNIXタイムスタンプの値が変換されていることが確認できました。
```
$ aws s3 cp s3://{バケット名}/output/to_timestamp/run-1675387460522-part-r-00000 - | jq
{
  "order_id": "00001",
  "org_created_on": 1675414800,
  "org_updated_on": 1675384053,
  "goods": {
    "goods_id": "g-00001",
    "price": "1000"
  },
  "converted_updated_on": "2023-02-03 00:27:33.0"
}
$
```

### Format
- converted_create_onを見ると、指定したフォーマット「yyyy-MM-dd'T'HH:mm:ss.SSSZ」形式で出力されてることがわかります。
```
$ aws s3 cp s3://{バケット名}/output/format_timestamp/run-1675387494914-part-r-00000 - | jq
{
  "order_id": "00001",
  "org_created_on": 1675414800,
  "org_updated_on": 1675384053,
  "goods": {
    "goods_id": "g-00001",
    "price": "1000"
  },
  "timestamp_created_on": "2023-02-03 09:00:00.0",
  "converted_created_on": "2023-02-03T09:00:00.000+0000"
}
$
```

# 考察
連番を振りたいケースやユニークなIDを手軽に採番できるのは、とても便利だと感じました。


# 参考
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

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

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

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

https://docs.aws.amazon.com/glue/latest/ug/transforms-to-timestamp.html

https://docs.aws.amazon.com/glue/latest/ug/transforms-format-timestamp.html