Glueの使い方的な㊹(S3データセットの操作 Transition/Purge)

# GlueContextクラスのtransition_tableを使ってS3のストレージクラスを変更する

この機能のリリース
https://aws.amazon.com/jp/about-aws/whats-new/2020/01/aws-glue-adds-new-transforms-apache-spark-applications-datasets-amazon-s3/

この機能のドキュメント
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-api-crawler-pyspark-extensions-glue-context.html

対象のGlueテーブルの実際のS3オブジェクトのストレージクラスをGlacierやIAに変更します。ジョブの最後に必要ならストレージクラスを変更したり、大量データに対しては１つのジョブにしてワークフローの最後に行ったり定期実行するなど良さそう。

## ジョブの内容

JupyterNotebookで、GlueテーブルのS３オブジェクトのストレージクラスを変更します。

# 全体の流れ

* 前準備
* ジョブ実行
* 確認
* その他：transition_s3_path/purge_table/purge_s3_path

# 前準備

## ソースデータ

2つのcsvデータを用意しS3にアップロードしておく。S3ストレージクラスはスタンダードです。

cvlog1.csv
cvlog2.csv

<img width="1170" alt="スクリーンショット 0002-05-10 8.48.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/cb43778e-42f3-fb82-9c30-998f39e7eff0.png">

### cvlog1.csv

今回データの中身はどうでもいいのですが、一応以下のようなデータが入っています。

```csv:cvlog1.csv
deviceid,uuid,appid,country,year,month,day,hour
iphone,11111,001,JP,2017,12,14,12
android,11112,001,FR,2017,12,14,14
iphone,11113,009,FR,2017,12,16,21
iphone,11114,007,AUS,2017,12,17,18
other,11115,005,JP,2017,12,29,15
iphone,11116,001,JP,2017,12,15,11
pc,11118,001,FR,2017,12,01,01
pc,11117,009,FR,2017,12,02,18
iphone,11119,007,AUS,2017,11,21,14

```

```csv:cvlog2.csv
deviceid,uuid,appid,country,year,month,day,hour
other,11110,005,JP,2017,11,29,15
iphone,11121,001,JP,2017,11,11,12
android,11122,001,FR,2017,11,30,20
iphone,11123,009,FR,2017,11,14,14
iphone,11124,007,AUS,2017,12,17,14
iphone,11125,005,JP,2017,11,29,15
iphone,11126,001,JP,2017,12,19,08
android,11127,001,FR,2017,12,19,14
iphone,11128,009,FR,2017,12,09,04
iphone,11129,007,AUS,2017,11,30,14
```

<img width="877" alt="スクリーンショット 0002-05-10 12.56.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/0c334a49-bc6a-58da-58d8-97e0a9d50401.png">

# ジョブ実行

【参考】公式ページから引用↓

```
glueContext.transition_table("database", "table", "STANDARD_IA", {"retentionPeriod": 1, "excludeStorageClasses": ["STANDARD_IA"], "manifestFilePath": "s3://bucketmanifest/", "accountId": "12345678901", "roleArn": "arn:aws:iam::123456789012:user/example-username"})
```

JupyterNotebookを起動します。
手順はこの辺を参考にしてもらえたらと
https://qiita.com/pioho07/items/29bd779f84b4add9cf2c

以下のコードでジョブを作成し実行する。内容は"se2_in12"という名前のテーブルのS３オブジェクトのストレージクラスをIAに変更します。
※「retentionPeriod」のオプションの意味がドキュメント見ても分かりづらいのですが、要するに「指定した期間は変換の対象にしません」という意味になります。今回は"retentionPeriod 0"を指定することでいつ実施してもストレージクラスの変換を行いますが、例えば"retentionPeriod 1"と指定すると、オブジェクトのタイムスタンプが1時間経過していなければストレージクラス変換の対象にしません。ストレージクラスだけ変換してもタイムスタンプは更新されます。一定時間経ったオブジェクトだけストレージクラスをIAやGlacierに変換するということができますね。そういうオプションだと思います。

```python:transitionjob
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)

glueContext.transition_table("se2", "se2_in12", "STANDARD_IA", {"retentionPeriod": 0, "manifestFilePath": "s3://test-glue00/se2/manifest/", "accountId": "<aws account id>", "roleArn": "arn:aws:iam::<aws account id>:role/test-glue"})
```

<img width="878" alt="スクリーンショット 0002-05-10 12.56.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/802f0ca7-fa00-28cd-4033-22412729d056.png">

# パラメータ

* database – 使用するデータベース。
* table_name – 使用するテーブルの名前。

* transition_to – 移行先の Amazon S3 ストレージクラス。

* options – 削除するファイルとマニフェストファイルの生成のためのファイルをフィルタリングするオプション。

 * retentionPeriod – ファイルを保持する期間を時間単位で指定します。保存期間より新しいファイルは保持されます。デフォルトでは 168 時間（7 日）に設定されています。
 * partitionPredicate – この述語を満たすパーティションは移行されます。これらのパーティションの保存期間内のファイルは移行されません。デフォルトでは "" – 空に設定されます。
 * excludeStorageClasses – excludeStorageClasses セット内のストレージクラスを持つファイルは移行されません。デフォルトは Set() – 空白のセットです。
 * manifestFilePath – マニフェストファイルを生成するためのオプションのパス。正常に移行されたすべてのファイルが Success.csv に記録され、失敗したファイルは Failed.csv に記録されます。
 * accountId – 移行変換を実行する AWS アカウント ID。このトランスフォームには必須です。
 * roleArn – 移行変換を実行する AWS ロール。このトランスフォームには必須です。
* transformation_ctx – 使用する変換コンテキスト (オプション)。マニフェストファイルパスで使用されます。

* catalog_id – アクセス中の データカタログ のカタログ ID（データカタログ のアカウント ID）。デフォルトでは、None に設定されています。None のデフォルト値は、サービス内の呼び出し元アカウントのカタログ ID になります。

# 確認

### S3オブジェクトの確認

対象の2つのS3オブジェクトのS3ストレージクラスが、スタンダード->IAに変更されました。

<img width="1139" alt="スクリーンショット 0002-05-10 9.34.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/49ecc60a-4bc5-36e5-36c6-6655ecad43cd.png">

### マニフェストファイル確認

test-glue00/se2/manifest/配下にマニフェストファイルとして正常に移行されたすべてのファイルが success配下に、失敗したファイルは failure配下にファイルとして記録されます。
※ドキュメントではsuccess.csvファイルに出力とあるが現状の動作はsuccessフォルダにrun-xxx-part-r-xxxという名前のファイルが出力されます。

<img width="1062" alt="スクリーンショット 0002-05-10 9.23.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/e1fd8b26-da86-5015-b24e-5b83937bb4c1.png">

成功したのでSUCCESS配下のファイルをS3 Selectで表示してみます。

<img width="1145" alt="スクリーンショット 0002-05-10 9.24.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/47ad1c87-de31-ebc1-bc47-c557b6ec0669.png">

今回の対象となった「S3バケット、パス/オブジェクト名」が示されてます。

<img width="1152" alt="スクリーンショット 0002-05-10 9.24.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/b00109df-bd5a-ed76-9daf-fbb6dcfdf30f.png">

#その他：transition_s3_path/purge_table/purge_s3_path

使い方としては今回紹介したtransition_tableとほとんど同じです。オプションなども似ています。

* transition_s3_path

S3パスを指定してS3ストレージクラスの変更

* purge_table

テーブルのオブジェクトの削除

* purge_s3_path

S3パスを指定してオブジェクトの削除

## こちらも是非

Glueの使い方まとめ
https://qiita.com/pioho07/items/32f76a16cbf49f9f712f