巷でうわさの Cloud Dataprep を実際に試してみるの巻

こんばんは！最近 Google Home を買っていろいろ試してる @wezardnet です。自分的には、（音質は悪くないと思うので）ワイヤレススピーカーとして利用しても十分元は取れたかなっと思ってます :headphones:

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">ウチにも Google Home が来ましたよ！<br>会社にも置いてあるけど、一部の人達しか自由に使えないので自分で買う事にしたわ 🤧 <a href="https://t.co/DplKZIpzln">pic.twitter.com/DplKZIpzln</a></p>&mdash; wezardnet (@wezardnet) <a href="https://twitter.com/wezardnet/status/925698143626215429?ref_src=twsrc%5Etfw">2017年11月1日</a></blockquote>

さて、今年こそは [Advent Calendar](https://qiita.com/advent-calendar/2017/gcp) に参戦しようとネタを考えてるうちに埋まってしまいました。ネタはカレンダーに登録してから考えた方が良さそうですね、失敗したわ... :cry:
というわけで、今回は通常の投稿になってしまいますが、うわさで聞いた Google Cloud Platform(GCP) の [Cloud Dataprep](https://cloud.google.com/dataprep/) というモノを実際に使って体験してみたことを共有したいと思います。


# 参考にした記事 など...
公式ドキュメント以外では、あまり解説記事や事例紹介などは見かけなかったですが @satoru_mag さんの以下の記事が大変参考になりました :thumbsup:

* [Dataprepを触ってみる](https://qiita.com/satoru_mag/items/a0cfd3ad05985685b761)
* [Dataprepで国勢調査のデータをBigQueryに入れてみる。](https://qiita.com/satoru_mag/items/f2e42b8264c86fca80f2)


# Cloud Dataprep は何に使うの？
コーディングレスでデータ変換、あるいは加工することができます。また、異常値を検出したりなどデータ分析にも使えます。その他に思いつくユースケースとしては、個人データをマスクしたりなど、サーバーレス データマスキングツールとしても活用できそうな気がします♪


# 構成 など...
はじめに CSV データを Google Cloud Storage(GCS) にアップロードします。次にそれを Dataprep にインポートしてデータ クレンジング（の実験）を行い、最終的に BigQuery に出力するという感じで使ってみます。。。

![Cloud Dataprep.png](https://qiita-image-store.s3.amazonaws.com/0/12023/4b46ffa5-e856-7db5-5018-09f73d271b7f.png)

インターネット上で公開しても良い適当なデータが手元にないので、次のようなダミーの顧客マスタを使うことにします。

```
1,アサヒカッポウ,朝日割烹,101-1132,群馬県邑楽郡大泉町 2-4-11,,0276-48-3531,0276-48-8323,越坂部  仁美,0.2,mtori54@Youbin.yu.jp,http://www.njc.co.jp/
2,チチュウカイリョウリレイア,地中海料理レイア,101-1133,埼玉県比企郡吉見町 13-2-10,,0493-23-5755,0493-23-2046,佐々木  和人,0.5,mtori55@mailmail.ne.jp,https://www.google.com/
3,ロシアリョウリレストラン,ロシア料理レストラン,101-1134,東京都調布市大郷 3-4-29,,0424-40-2843,0424-40-4435,末次  晴彦,0.3,mtori56@abc.pe.jp,http://www.yahoo.co.jp
・
・
・
```

Dataprep の UI が微妙に変わってたりしますが、ベータなので今後も変わる可能性はあります。基本的にはデータを Dataprep にインポートして、レシピ（Recipe）から新しいステップ（New Step）を作る手順になります。


# 【実験１】住所から都道府県を抜き出して項目を分離させる
住所が入っている項目から都道府県を抜き出して、それぞれ別項目に分離させてみることにします。次のようにステップのパラメータを入力します。

* 変換（Choose a transformation） → 「split」を選択する
* カラム（Column） → 住所が入っているカラム名を入れる
* パターン（Patterns） → 「Between two patterns」を選択する
    * starting after → /^(.{1,3}[都|道|府|県])/
    * ending before → \`{digit}{0}\`

これでステップを作ると、次のようにプレビューが表示され、都道府県を分離することができました :grinning:

![dataprep01.png](https://qiita-image-store.s3.amazonaws.com/0/12023/3d8bbee2-587e-148e-281f-ba785331d2fc.png)


# 【実験２】URL からドメインを抽出してみる
ホームページ URL からドメインを抜き出してみることにします。ステップのパラメータは次のように入力します。

* 変換（Choose a transformation） → 「derive」を選択する
* 式（Formula） → 「DOMAIN({URL が入っているカラム名})」
* 新しいカラム名（New column name） → DOMAIN 関数の出力先のカラム名を入力する

これでステップを作ると、次のようにプレビューが表示され、ドメインが抽出されるはず、、、と思いきや期待どおりな結果が得られず[公式ドキュメント](https://cloud.google.com/dataprep/docs/html/DOMAIN-Function_57344764)を読み直す。
どうやら DOMAIN 関数では多階層のトップレベルドメインの解析はドメインの最初の部分を返すという注意書きがあるので仕様のようです :pensive:

![dataprep02.png](https://qiita-image-store.s3.amazonaws.com/0/12023/45607119-bc48-9c5f-c0b7-2ada13cefa38.png)


# 【実験３】電話番号と FAX 番号からハイフンを除去する
電話番号と FAX 番号からハイフンを除去して数字のみにしたい時は、次のようにステップを作ります。

* 変換（Choose a transformation） → 「replace」を選択する
* カラム（Column） → 電話番号と FAX 番号が入っているカラム名を入れる
* パターン（Patterns） → 「On pattern」を選択する
    * on → \`{delim}\`
* 新しい値（New value） → 空欄
* すべてマッチさせるか（Match all occurences） → Yes

![dataprep04.png](https://qiita-image-store.s3.amazonaws.com/0/12023/ab355825-1441-bb81-1b68-02176d346560.png)


# 【実験４】特定の条件に合致するデータのみ取捨選択する
今回は顧客マスタ（CSV データ）から「東京都」のデータのみ BigQuery に投入したいため、「東京都」以外のデータを削除するようにステップを作ります。

* 変換（Choose a transformation） → 「delete」を選択する
* 条件（Condition） → ``if(notequal({都道府県が入っているカラム名}, '東京都'), true, false)``

↑のようにすると、「東京都」以外のデータは削除されますが、これは UI 上そう見えるだけで実際には削除されていません。Dataprep は作成したステップに基いて変換（加工）したデータをプレビューするだけの機能と考えると良いと思います。

![dataprep05.png](https://qiita-image-store.s3.amazonaws.com/0/12023/e23ee4fe-eb6b-d2bd-c3e2-8870c4547951.png)

# BigQuery に出力する
ステップの作成がすべて完了したら、ジョブを走らせて BigQuery に変換（加工）後のデータを出力してみます。画面右上の Run Job ボタンをクリックします。

![dataprep06.png](https://qiita-image-store.s3.amazonaws.com/0/12023/2ea95867-a262-45bb-3cb4-c32fc4491495.png)

Add Publishing Action で出力先に BiｇQuery を選択します。今回の例では dataprep というデータセットの中に customer というテーブルに出力します。

![dataprep07.png](https://qiita-image-store.s3.amazonaws.com/0/12023/77484dd4-dd20-17d9-8f55-712b4963cdab.png)

次に出力方法を指定します。データを追加するのか、既存のデータをすべて削除して入れるのか、テーブルを削除してから入れるのかのいずれかを選択します。

![dataprep08.png](https://qiita-image-store.s3.amazonaws.com/0/12023/edea6399-767d-1d98-c88d-0e8d54d4b467.png)

以上でジョブの作成は完了です。それでは、このジョブを実際に実行してみましょう！ジョブを実行すると、コンソールに次のように実行状態が表示されます。

![dataprep09.png](https://qiita-image-store.s3.amazonaws.com/0/12023/1c31d115-ad31-2dbf-d971-1885f704c59f.png)


# 裏側で Dataflow が実行されるので眺める
ジョブを走らせると、裏側では [Cloud Dataflow](https://cloud.google.com/dataflow/) が頑張ってるので、チラッと様子を見てみましょうｗｗ

![dataflow.png](https://qiita-image-store.s3.amazonaws.com/0/12023/ab8d6c22-e3c0-9179-686d-f69f4d1aa94f.png)


# 実行ジョブの結果を確認する
ジョブが完了すると Dataprep のコンソールで次のように表示されます。

![dataprep03.png](https://qiita-image-store.s3.amazonaws.com/0/12023/1d20d23c-6dc9-7bcc-b4f3-070c0d726e68.png)

View Results で詳細画面に遷移します。

![dataprep09.png](https://qiita-image-store.s3.amazonaws.com/0/12023/52f80dad-90da-a608-9016-9940551caf6f.png)


# BigQuery にちゃんと入っているか確認する
東京都の顧客データのみ格納されていることが確認できます。これだけなら別に全データを投入してクエリーで弾けば済む話なのですが、ユースケースが思いつかなかっただけなのでご容赦ください :bow:

![bigquery.png](https://qiita-image-store.s3.amazonaws.com/0/12023/7e0cd1a7-79a0-a46a-6d48-50a7f0bb59fd.png)


# 所感 など...
コーディング不要でデータの変換や加工、あるいはちょっとした分析を行うには手軽に使えて良いと思います。ただ、ノンコーディングツールは大抵の場合 UI への抵抗（不慣れ）があったり、仕様や機能に制約されることが多く Dataprep も例外ではないと感じます。コード書く派の自分としては、ちょっともどかしさを感じる部分もありますが、ポチポチっで済んでしまうところは楽ちんですし、利用目的によって使うとイイかなっと思います。現状、個人的には、こういう機能が GCP にあることを知ってくおく程度で良いかなっと思ってます :scream_cat:


# 改善してほしい点
レシピの編集において、ステップの順序をドラッグ・アンド・ドロップで変更できるとイイなって思います :bulb:

![dataprep10.png](https://qiita-image-store.s3.amazonaws.com/0/12023/07eff3a7-feb7-955f-fe6a-c736a07b49b9.png)