ABEJA Platformでスキーマ機能を利用して、入力データの検証

##はじめに
ABEJA Platformは機械学習を実施する際のデータレイク・アノテーション・学習・インフラ運用などをパイプラインで管理・実施いただけるSaaS型のサービスです。
柔軟度が高く、学習によく利用できるフレームワークを利用できるため、MLエンジニアやデータサイエンティストの方が不要な作業をせずにより開発のスピードアップと集中を実施いただけることがメリットです。

## 今回ご紹介するもの
#### 「 ABEJA Platformスキーマ機能 」

![schema.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14014/f204225f-1a27-ac37-7ef9-4350035196a4.png)


## 「 ABEJA Platformスキーマー機能 」って？
ABEJA Platformで、テーブルデータを利用したい場合、データを保存する前にデータに矛盾がないか保証を実施したいケースがあるかと思います。今回紹介するスキーマ機能は、データレイクへのデータ保存前にデータ内の整合性を検証し、問題なければ保存するといった機能となります。主に以下の手順を実施することで、簡単にValidation(検証)を実施いただけます。

- **スキーマの作成**
- **データレイクチャンネルと紐付け**

今回は、データレイクチャンネルにアップロードしたCSVをValidationできるか試してみたいと思います。

サンプルCSVは[「Iris.csv」](https://www.kaggle.com/saurabh00007/iriscsv/downloads/iriscsv.zip/1)を利用しています。

それでは、早速実施していきましょう。

## 設定 (スキーマ作成)
- まずは、スキーマを作成します。サイドメニューから「スキーマ」を選択し**「スキーマ作成」**を選択
<img width="1670" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14014/d75560e4-5d71-fadf-aff7-467c1615c772.png">

今回はサンプルCSVに対するValidationを実施するため、以下の項目でスキーマ作成を行います。

| 項目(Item) | 型(Type) |
|:-----------------:|:------------------:|
| ID   | integer |
| SepalLengthCm | float |
| SepalWidthCm |  float |
| PetalLengthCm |  float |
| PetalWidthCm | float |
| Species | string | 


- 各スキーマ設定に関する項目を入力します。
    - `スキーマ名`：スキーマの名称
    - `詳細`：スキーマの説明 (任意)
    - `スキーマ`：「ビジュアル」か「JSON」を選んでスキーマを選択可能
        - `ビジュアル`：「カラム名」「型」「プライマリキー」「必須」「nullを許容」を選択
        - `JSON`：以下サンプルのようにカラム名、型などをJSON形式で指定

```json:sample.json
{
  "Species": {
    "type": "string",
    "required": false
  },
  "SepalWidthCm": {
    "type": "float",
    "required": true
  },
  "SepalLengthCm": {
    "type": "float",
    "required": true
  },
  "PetalWidthCm": {
    "type": "float",
    "required": true
  },
  "PetalLengthCm": {
    "type": "float",
    "required": true
  },
  "ID": {
    "type": "integer",
    "required": true
  }
}
```

上記の項目を参考に入力していきましょう。

**■「ビジュアル」の場合**
<img width="1515" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14014/3a9b7e1c-f853-4651-43c2-d1c2e8db5061.png">

**■「JSON」の場合**
<img width="1515" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14014/d5ae5dce-4faa-4d83-c43e-12a3d7695768.png">

問題なければ**「スキーマ作成」**を選択。これで「スキーマ」の完成となります。


## 設定 (データレイクチャンネルへ紐付け)
- 早速作成したスキーマ設定でCSVデータのValidation実施できるよう、データレイクチャンネルへ紐付けを行います。挙動としては、データレイクチャンネルへCSVファイルをアップロードした際に、CSVデータに矛盾がないかValidation(検証)実施するイメージとなります。

- まずは、データレイクチャンネルを作成
<img width="1663" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14014/5ec07cb7-31be-109b-3907-1d93edcc2f24.png">
<img width="1462" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14014/67f5fbf4-5177-c5fc-7456-997b14d449c1.png">

- その後、データレイクチャンネルの内の「メニュー」から「スキーマ紐付ける」を選択
<img width="1461" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14014/ebd3af6c-0baa-0b24-c221-9ae3f5b06ca0.png">

- 実際にアップロードを実施する予定のファイル属性やカラム等の設定を実施
    - 以下、設定項目となります。
        - `スキーマID`：作成したスキーマを選択
        - `スキーマバージョン`：利用するスキーマのバージョンを選択
        - `Content Type`：「JSON」「x-jsonlines」「CSV」から選択 (今回はCSVを選択)
        - `データベースを使用する`：スキーマ機能を利用してDBへの格納も利用可能です。
        - `既存のレコードを上書きする`：テーブルへの追記ではなく上書きを実施する場合に選択
        - `スキーマで定義されていないカラムを無視する`：必要に応じて選択
        - `CSVの1行目をヘッダーとする`：CSVの1行目の項目をヘッダとして利用する場合に選択　　

**※データベースをご利用の際は、別途[お問い合わせ](https://abejainc.com/platform/ja/contact/)ください**
**※こちらの機能`CSVの1行目をヘッダーとする`については2019年7月現在、改修中となっております**

各項目を入力し、**「紐付ける」**を選択頂くことで、設定完了です。

<img width="758" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14014/b6c3f096-01ef-ed2f-f1a6-fc2c9795d9ba.png">


## 動作確認
- 早速、スキーマを紐付けたデータレイクチャンネルにCSVファイルをアップロードして挙動を確認してみましょう。

- **スキーマ機能を利用せずにアップロードした場合**
<img width="1491" alt="8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14014/ec526ea2-242c-5ec0-274f-2d049060b397.png">


- **正常ファイルの場合**
ファイル名の左に**緑のチェック**が付与され、正常にValidationされたことが見てわかります。
<img width="1492" alt="9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14014/50ec871f-37cd-3fcc-3c8e-87a38c777566.png">
緑チェックを選択頂くと以下のように、どのスキーマでValidation OKとなったかも確認できます。
<img width="1491" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14014/aeac33df-f6b2-4619-d77c-94f2a444aae5.png">



- **異常ファイルの場合**
ファイル名の左に**赤のエクスクラメーションマーク**が付与され、Validationに失敗したことが見てわかります。
<img width="1490" alt="11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14014/607aded8-9092-cc94-8a4e-5311797c3c4d.png">
赤のエクスクラメーションマークを選択すると、どの部分でValidation Errorとなったかも確認できます。
この場合、1行目に指定した型と違う値があったため、Errorとなってことがわかります。
<img width="1481" alt="12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14014/292e08cb-f649-c2b4-2488-a4611031104e.png">


このように、きちんとCSVデータの中身の整合性を検証して、正常なデータのみデータレイクチャンネルに保管ができる環境が簡単に整いました。テーブルデータを利用頂く場合でも、GUI上で、ABEJA Platform上にスキーマ作成をしていただき、Validationを実施頂くことが可能です。

## まとめ
今回はスキーマ機能の一例として、データレイクチャンネルにアップロードするCSVファイルのValidationをサンプルとして実施しました。その他活用方法として、ABEJA Platformのスキーマ機能を活用しDBへの格納や、DBへの外部接続等も利用できますので、よりテーブルデータ周りの学習・モデル作成を加速していただけます！
ぜひ、スキーマ機能を活用してもご活用ください！


## 最後に
ABEJA Platformは、トライアルも提供しています。気になられた方は、是非、お気軽にお問い合わせください！また、フォーラムもありますので、是非、ご活用ください。

**ABEJA Platformに関するお問い合わせ**
https://abejainc.com/platform/ja/contact/

**ABEJA Platform Forum**
https://forums.abeja.io/