[AWS]AWSGlueを使ってデータをクレンジングする

# 出会いは突然に…

ふらっとDynamoDBを眺めていると、信じられないアトリビュートでデータがputされているのを発見しました。
まぁ何かって言うと、アトリビュートに半角スペースが入っているだとぉ！？！？

```json
{
  "id": "hoge",
  "record_time": "2018/10/26T00:00:00Z",
  "sensor value": "100"
}
```

`sensor value` みたいな感じで半角スペースが入っていました。

## 何が困るか

DynamoDBからJSONをS3に吐き出してAthenaでデータを解析しようとすると、当然半角スペースが存在しているので失敗します。
SQLで半角スペースがアトリビュートに入っているなんてことありえませんからね…

## そんなときにAWSGlue

AWSGlueはETLのサービスです。
最近DynamoDBをデータソースに指定することができるようになりました。
AWSGlueではデータソースから取得したデータをJSONなどに変換してS3などに置くことができます。
なので半角スペースを `_` などに変換してJSONを吐き出していきます。

## Glueを使っていく

### テーブルの作成

まずテーブルを作成する必要があります。
このテーブルはGlueのデータソースになるものです。
テーブルといっても実際のデータを持っているのではなく、対象となるデータソースのプロパティだったりとか、スキーマなどを持っているものになります。
クローラを回して作成していきましょう。

<img width="653" alt="AWS Glue Console 2018-10-26 13-35-03.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/62607541-d2a2-4803-9837-740e50c168dc.png">

<img width="884" alt="AWS Glue Console 2018-10-26 13-37-36.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/b62ddd6c-0d6b-9de1-cac7-dc95fb8f90b9.png">

<img width="938" alt="AWS Glue Console 2018-10-26 13-39-01.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/840e8718-1657-a1ff-e1df-8664c44cf7ef.png">

<img width="570" alt="AWS Glue Console 2018-10-26 13-40-43.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/35c2be8b-1bb1-405b-4325-ce2b904c439f.png">

<img width="920" alt="AWS Glue Console 2018-10-26 13-41-26.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/9d20d395-98cf-aa5c-2a47-63ed7b6cb468.png">

<img width="864" alt="AWS Glue Console 2018-10-26 13-42-21.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/ad8766ef-fdb4-0d82-3a32-acbbd9a56fc3.png">

<img width="884" alt="AWS Glue Console 2018-10-26 13-43-06.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/0c877771-62a0-6be2-d722-f6cb2e82eb15.png">

<img width="1069" alt="AWS Glue Console 2018-10-26 13-44-18.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/3466ebbd-5712-6e89-7ea9-55a8e73caff2.png">

完了を押すと、クローラのリスト画面に戻りこのようなメッセージが出るので、「今すぐ実行しますか？」をクリックして、クローラを実行します。

<img width="856" alt="AWS Glue Console 2018-10-26 13-45-23.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/407a5f15-664e-0bfb-f0f4-85077a91f328.png">

対象クローラのステータスが「Stopping」になれば完了しています。

<img width="1351" alt="AWS Glue Console 2018-10-26 13-47-45.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/fe674a2a-a67e-4115-061e-86cc1242dff7.png">

作成したテーブルの情報は、テーブルのリスト画面で確認することができます。

<img width="598" alt="AWS Glue Console 2018-10-26 13-50-28.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/60173619-fbda-b219-95b0-92946ec35765.png">

<img width="818" alt="AWS Glue Console 2018-10-26 13-51-35.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/4766ebd9-0aff-5fa5-39a3-ecac5cde62c7.png">

## ジョブの追加 / 実行

ジョブを追加していきます。

<img width="539" alt="AWS Glue Console 2018-10-26 13-53-03.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/51fdd460-7332-973e-cada-a5dffa02f078.png">

<img width="896" alt="AWS Glue Console 2018-10-26 13-54-07.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/ee407a36-49b2-3ff2-3c99-3f31d1614b3d.png">

<img width="1430" alt="AWS Glue Console 2018-10-26 13-57-09.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/cb2222a0-1c8e-1a6e-95f4-1b804b28c57e.png">

<img width="496" alt="AWS Glue Console 2018-10-26 14-03-34.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/6fab0e0c-a9a7-690f-da05-25596b962798.png">

<img width="1485" alt="AWS Glue Console 2018-10-26 14-02-11.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/f8978989-5c6f-53aa-d9b2-9fb7867259c0.png">

<img width="1173" alt="AWS Glue Console 2018-10-26 14-05-14.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/b4f8ac2d-5d4f-c55e-6e06-94f54d74b08e.png">

<img width="968" alt="AWS Glue Console 2018-10-26 14-06-46.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/4695cd2f-b322-b860-01ad-51571c9fbdea.png">

成功するとS3にファイルが生成されています。
中身はこんな感じ

```json
{
  "id":"hoge",
  "record_time":"2018/10/26T00:00:00Z",
  "sensor_value":"100"
}
```

ちゃんと `sensor value` が `sensor_value` に変換されていますね！

## さいごに

今回はDynamoDBからデータを抽出して、変換・加工してS3にオブジェクトをputするようなジョブを書きました。
DynamoDBを利用していると、割とアトリビュートの命名規則などがなんでもOKみたいな世界があり、今回のように半角スペースが含まれているなんて自体が発生します。
もちろんデータ設計、テーブル設計の段階で弾ければいいのですが、そうも行かない場合があります。
せっかく溜まったデータを分析できないままではただのゴミデータになってしまうので、Glueのようなサービスを活用してデータをクレンジングしましょう。
ではまた！