Glueの使い方的な⑭(クローラー(Crawler)のSchemaChangePolicyその１)

### Crawler SchemaChangePolicy の効果をみてみる

# 今回使うGlueのリソース名
#### クローラー名
se2_in6
se2_out9

#### ジョブ名
se2_job9

#### データ
入力:in6
出力:out9

# 全体の流れ

* 前準備
* Crawler SchemaChangePolicy　のデフォルト値確認
* Schema updates in the data store の確認
* CLIによる確認

※長くなったので、"Object deletion in the data store"は次回

# 前準備

### 今回使うサンプルジョブ、入力ファイル、出力ファイル

[Glueの使い方的な②(csvデータをパーティション分割したparquetに変換)](https://qiita.com/pioho07/items/523aec26ca5dc5bc9697)のジョブをse2_job9、入力データをin6、出力データをout9にそれぞれ複製して今回利用する。

上記で実行した処理は以下のCSVファイルをyear,month,day,hourでパーティション分割している。

```csv:元となったCSVファイルcvlog.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
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
```

### 今回利用する入力データ(in6)をクローリングしたスキーマ情報

<img width="973" alt="スクリーンショット 0030-05-28 23.13.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/f2f77aa4-7d14-3e5b-c6c1-ddd478eb8502.png">


### 今回利用する出力データ(out9)をクローリングしたスキーマ情報

<img width="963" alt="スクリーンショット 0030-05-28 10.27.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/b4022efb-3e87-04a3-1850-78b7f9bee416.png">

### Athena によるデータ内容確認

<img width="923" alt="スクリーンショット 0030-05-27 22.45.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/bbe1b315-4576-8221-56b2-5e873014634d.png">

### Athena によるデータ件数確認

19件

<img width="907" alt="スクリーンショット 0030-05-27 22.45.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/0f127037-1747-604a-e373-d316f58f1af4.png">

### ディレクトリ構成

in6に入力ファイル、out9に出力ファイル

```
$ aws s3 ls s3://test-glue00/se2/in6/
2018-05-27 21:11:45          0 
2018-05-27 21:12:13        691 cvlog.csv
```

```
$ aws s3 ls s3://test-glue00/se2/out9/
                           PRE year=2017/
2018-05-27 21:23:08          0 
2018-05-27 21:23:35        498 _common_metadata
2018-05-27 21:23:35      11419 _metadata
2018-05-27 21:23:35          0 year=2017_$folder$
1$ aws s3 ls s3://test-glue00/se2/out9/year=2017/
                           PRE month=11/
                           PRE month=12/
2018-05-27 21:25:01          0 month=11_$folder$
```

# Crawler SchemaChangePolicy のデフォルト値確認

クローラーのEditをクリックし、以下の画面まで進み、"設定オプション(省略可能)"をクリック

<img width="552" alt="スクリーンショット 0031-06-10 19.07.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/d88f5feb-909f-fa2d-188c-f51eae912d11.png">

SchemaChangePolicy が表示される

<img width="616" alt="スクリーンショット 0031-06-10 15.40.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/282883e2-7e9d-7a5e-91a2-c63827831923.png">

# Schema updates in the data store

"クローラがデータストア内のスキーマの変更を検出すると、AWS Glueはデータカタログのテーブル更新をどのように処理する必要がありますか？"

SchemaChangePolicy の UpdateBehavior と呼ばれ３種類から選べる

* "データカタログのテーブル定義を更新する"
* "新規列のみを追加します"
* "変更を無視して、データカタログのテーブルを変更しない"


## "データカタログのテーブル定義を更新する"

テーブルのスキーマ情報を手動などで変更した場合、クローラーによって再度更新が行われます。(つまり戻ります)

例えば以下のスキーマに

<img width="1094" alt="スクリーンショット 0030-05-28 14.29.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/d4fba5f5-a432-a272-3edd-e7cd48fad373.png">

①9個目のカラムの追加や、dayのカラムをStringからBIGINTに修正

<img width="1080" alt="スクリーンショット 0030-05-28 14.29.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/e0b4f3a0-2a0f-5350-f277-1212063c2d38.png">

クローラーを実行すると、クローラーの実行後にupdatedが1となり更新が行われます。

![スクリーンショット 0030-05-28 14.37.00.png](https://qiita-image-store.s3.amazonaws.com/0/27932/3bc2cd80-55e8-3a54-3887-e0fe393d5d94.png)

クローラー実行後のスキーマの内容は以下のようになり、元のスキーマ情報に戻っています

<img width="981" alt="スクリーンショット 0030-05-28 14.32.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/ffed51b9-216e-6c1b-b3e8-b8af4ac3a3f4.png">

②入力csvファイルのcvlog.csvに、列を追加(testという名前の列)したcvlog1.csvを作成し、S3の同じ場所にアップする

```csv:元となったCSVファイルcvlog.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
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
```

```csv:列を追加したCSVファイルcvlog1.csv
deviceid,uuid,appid,country,year,month,day,hour,test
iphone,11111,001,JP,2017,12,14,12,a
android,11112,001,FR,2017,12,14,14,a
iphone,11113,009,FR,2017,12,16,21,b
iphone,11114,007,AUS,2017,12,17,18,c
other,11115,005,JP,2017,12,29,15,c
iphone,11116,001,JP,2017,12,15,11,a
pc,11118,001,FR,2017,12,01,01,a
pc,11117,009,FR,2017,12,02,18,a
iphone,11119,007,AUS,2017,11,21,14,a
other,11110,005,JP,2017,11,29,15,a
iphone,11121,001,JP,2017,11,11,12,a
android,11122,001,FR,2017,11,30,20,a
iphone,11123,009,FR,2017,11,14,14,a
iphone,11124,007,AUS,2017,12,17,14,a
iphone,11125,005,JP,2017,11,29,15,a
iphone,11126,001,JP,2017,12,19,08,a
android,11127,001,FR,2017,12,19,14,a
iphone,11128,009,FR,2017,12,09,04,a
iphone,11129,007,AUS,2017,11,30,14,a
```

クローリングする。
結果のスキーマ情報に、testの列ができている

<img width="977" alt="スクリーンショット 0030-05-28 22.00.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/14a6b846-1506-ad75-3c18-ed63c73ed032.png">

Athenaによる確認。test列ができている。以前のデータはtest列はnull

<img width="910" alt="スクリーンショット 0030-05-28 22.01.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/c17a6463-2394-5e50-cd77-c382abb3ccda.png">

<img width="908" alt="スクリーンショット 0030-05-28 22.01.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/11653f17-6c4d-3e50-087d-58302af0bdc3.png">

<font color="Red">「"データカタログのテーブル定義を更新する"は常にクローリングした結果をスキーマに反映したいときに使う」</font>
これがデフォルトです

## "新規列のみを追加します"

※201805頃出た新しい機能
https://forums.aws.amazon.com/ann.jspa?annID=5696

<b>S3にデータがある場合にのみ有効なオプション</b>で、検出した新しい列は追加されますが、既存の列のタイプは Data Catalog で削除または変更されません。

①と同じ作業を実施すると、更新がそのまま残っている

詳細割愛

②と同じ作業を実施すると、追加した列(testという名前)が追加されている。

<img width="975" alt="スクリーンショット 0030-05-28 22.21.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/42bb12cf-902d-7332-50c1-6b93bf3986db.png">

Athenaで確認。追加した列(testという名前)が追加されている

<img width="896" alt="スクリーンショット 0030-05-28 22.22.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/066f0b9b-8fee-ccba-8452-4cbb9fbb8b4a.png">

③入力csvファイルのcvlog.csvに、列を追加(testという名前の列)したcvlog1.csvを作成し、S3の同じ場所にアップする

```csv:元となったCSVファイルcvlog.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
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
```

```csv:元となったCSVファイルcvlog1.csv
deviceid,uuid,appid,country,year,month,day,hour,test
iphone,11111,001,JP,2017,12,14,12,a
android,11112,001,FR,2017,12,14,14,a
iphone,11113,009,FR,2017,12,16,21,b
iphone,11114,007,AUS,2017,12,17,18,c
other,11115,005,JP,2017,12,29,15,c
iphone,11116,001,JP,2017,12,15,11,a
pc,11118,001,FR,2017,12,01,01,a
pc,11117,009,FR,2017,12,02,18,a
iphone,11119,007,AUS,2017,11,21,14,a
other,11110,005,JP,2017,11,29,15,a
iphone,11121,001,JP,2017,11,11,12,a
android,11122,001,FR,2017,11,30,20,a
iphone,11123,009,FR,2017,11,14,14,a
iphone,11124,007,AUS,2017,12,17,14,a
iphone,11125,005,JP,2017,11,29,15,a
iphone,11126,001,JP,2017,12,19,08,a
android,11127,001,FR,2017,12,19,14,a
iphone,11128,009,FR,2017,12,09,04,a
iphone,11129,007,AUS,2017,11,30,14,a
```

dayのカラムをBIGINTからStringに修正

<img width="985" alt="スクリーンショット 0030-05-28 22.37.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/b1e1d7f3-4b87-b0be-8380-2c2e64439059.png">

クローリングする。
結果のスキーマ情報に、dayのカラムはStringのまま変更されていない。新しいtest列ができている。

<img width="964" alt="スクリーンショット 0030-05-28 22.39.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/e6032b8a-18cc-cd89-735e-2e9580fb1f00.png">

Athenaによる確認。test列ができている。以前のデータはtest列はnull

<img width="899" alt="スクリーンショット 0030-05-28 22.39.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/de2aea1b-6339-7147-aafc-dd0bc697e187.png">

<font color="Red">「"新規列のみを追加します"は追加した列を反映しそれ以外はそのままにしたい時に使う」</font>

## "変更を無視して、データカタログのテーブルを変更しない"

テーブルのスキーマ情報を手動などで変更した場合、クローラーによって再度更新が行われない。(つまり戻らない)

①と同じ作業を実施すると、クローラーによる更新は行われません。(つまりクローラーによるスキーマ変更はなくなる)

クローラーを実行すると、クローラーの実行後にTable Updatedは0

<img width="989" alt="スクリーンショット 0030-05-28 14.52.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/ae482017-65be-b3bd-35c9-f21c549dbc0f.png">

スキーマも修正した状態が残っている

<img width="953" alt="スクリーンショット 0030-05-28 14.54.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/c0275bf0-6e33-1b62-a203-2abcdb2f2e56.png">

②と同じ作業を実施すると、クローラーによる更新は行われません。(つまりクローラーによるスキーマ変更はなくなる)
追加した列(testという名前)も反映されない。

Athenaで確認。
test列は出てこない

<img width="902" alt="スクリーンショット 0030-05-28 22.13.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/6fca2960-aee9-c044-7f0c-08b83ec8b2ad.png">

件数は入力ファイルをコピーしたので19件の倍の38件で合っている

<img width="582" alt="スクリーンショット 0030-05-28 22.13.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/734d0ede-29a9-20d7-4dd8-27de0c2d0a96.png">

<font color="Red">「"変更を無視して、データカタログのテーブルを変更しない"はクローラーによるスキーマ変更したくない時に使う(またはmsck prepair tableだけさせたい時とか?)」</font>

# CLIによる確認

#### get-crawler で SchemaChangePolicy の確認ができる

Crawler の se2_out9 の情報をコマンドで見てみる

```
$ aws glue get-crawler --name se2_out9
{
    "Crawler": {
        "CrawlElapsedTime": 0, 
        "Name": "se2_out9", 
        "CreationTime": 1527423893.0, 
        "LastUpdated": 1527490194.0, 
        "Targets": {
            "JdbcTargets": [], 
            "S3Targets": [
                {
                    "Path": "s3://test-glue00/se2/out9", 
                    "Exclusions": [
                        "_common_metadata", 
                        "_metadata"
                    ]
                }
            ]
        }, 
        "LastCrawl": {
            "Status": "SUCCEEDED", 
            "LogStream": "se2_out9", 
            "MessagePrefix": "99999999-9999-9999-9999-e3a72b9ccff7", 
            "StartTime": 1527490210.0, 
            "LogGroup": "/aws-glue/crawlers"
        }, 
        "State": "READY", 
        "Version": 7, 
        "Role": "test-glue", 
        "DatabaseName": "se2", 
        "SchemaChangePolicy": {
            "DeleteBehavior": "LOG", 
            "UpdateBehavior": "UPDATE_IN_DATABASE"
        }, 
        "TablePrefix": "se2_", 
        "Classifiers": []
    }
}

```

* "UpdateBehavior"がGUIだと以下です

<img width="616" alt="スクリーンショット 0031-06-10 15.40.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/ab5f2fc2-7d85-28fb-4885-a3d6dc8320a6.png">

Logが、"データカタログのテーブル定義を更新する"
MergeNewColumnsが、"新規列のみを追加します"
UPDATE_IN_DATABASEが、"変更を無視して、データカタログのテーブルを変更しない"
でGUIだと↓

<img width="542" alt="スクリーンショット 0031-06-10 19.02.29 3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/f8ebee9b-016d-7428-e3e6-7fc9d27a298b.png">

* "DeleteBehavior"がその下の部分でこちらは別の機会に

<img width="542" alt="スクリーンショット 0031-06-10 19.02.29 2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/909da809-4ce3-88f7-d122-2fb04dd0da4a.png">

## To Be Continue

Object deletion in the data store　の効用と Crawler APIによるConfiguration option の確認

## こちらも是非

AWS Glue コンソールでのクローラの設定
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/crawler-configuration.html



SchemaChangePolicy 構造
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/aws-glue-api-crawler-crawling.html#aws-glue-api-crawler-crawling-SchemaChangePolicy

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