Dataiku DSSで生産性を上げるためのベストプラクティス


# はじめに
Dataiku DSSを使っていると、フローがぐちゃぐちゃになったり、見にくくなったりすることがあります。
もっとうまく使うコツは無いものかと思い、公式サイトの[ベストプラクティスのページ](https://academy.dataiku.com/latest/library/best-practices.html)を日本語訳してみました。
字ばかりでわかりにくい部分もあったので、操作説明多めにいれています。

# Flow management
### Anchoring
インプットとアウトプットが明確なパイプ状で無駄なブランチが無いFlowが理想的なFlowです。
しかし、実際は多くの短いブランチを含むFlowを作成するケースもあります。このようなFlowは、デフォルトの設定のままだと、Flow画面上の入力データセットと出力データセットの位置が自動的に調整されます。これにより、Flow画面上で短いブランチが長く右端まで延び、Flowの全体が把握しにくくなることがあります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/9a682d9a-0abe-2750-58e2-ba9d62465ad2.png)

Anchoring設定をオフにすることで、Flowの表示を変えることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/85c90789-2f6e-7343-dac9-50819e140a8a.png)


Anchoring設定は、プロジェクトの設定画面から変更することが可能です。

- プロジェクト画面からsettingsを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/9dd6acaa-cd6f-11c1-c7e1-5cc90d4c54d9.png)

- Flow displayを選択し、Anchor Flow graphの☑をはずし、SAVEボタンを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/67577c95-0727-2eed-c1fc-11420ab9c637.png)

### Dataset and models exposition
##### プロジェクトを利用した作業分割
Frowが複雑になる場合は複数のプロジェクトを使用して作業を分割するとよいです。
例えば、以下のように機能ごとにプロジェクトを分けることができます。

- データ収集用
- 次に機械学習と分析用
- 視覚化用

~~##### プロジェクト間のデータセットの共有~~ (有料版で確認してもこの機能は確認できなかったため古い情報である可能性有り)
 ~~別のプロジェクトでプロジェクトのデータセットを使用するには、データセット（またはモデル）を別のプロジェクトに公開します。公開されたデータセットは、他のプロジェクトのソース要素になります。~~

~~プロジェクトの公開方法は以下。
settings→config→exposed elements and expose datasets (or models) to another project~~

~~これは、大きな事業をいくつかのプロジェクトに分割し、各ユーザーが自分のプロジェクトで作業できるようにする方法です。~~

~~一部のユーザーは、他のプロジェクトに公開することを意図したデータセットを主に含む「データマート」プロジェクトも作成します。~~

~~プロジェクト間の依存関係はすぐに迷路になり、データセットを公開する前に全体像を把握できることに注意してください。~~

##### Refactoring
Refactoringについてはまだ改善予定ですが、現段階でも実施可能です。

フローをシンプルかつ見やすく保つために以下のことに気を付けてください。
- 時々リファクタリングしましょう。
- レシピを一時的にコピーすることは推奨されません。時間がある場合は、フローを組みなおす方が良いです。
- フローに新しくブランチを追加する場合は、それが何のために必要か、またいつ削除可能となるかについて明記しておきましょう。
- 自分の担当分は整理しておきましょう。メンバー間で使いまわし出来そうな実装については共有しておき、車輪の再発明をしないよに気をつけましょう。
- 他メンバーの作業について知っておき、それらが自分の担当分にも応用できるか尋ねましょう。

# Doing exploratory work

新しいコードレシピ（Python、R、SQL…）が必要な場合、次のことをお勧めします。

意味のある名前で新しいノートブックを作成します。
必要なコードをインタラクティブに開発します。ノートブックでは、各ステップでコードを実行できます。正しい軌道に乗っているかどうかは常にわかります。
コードが満足のいくものになったら、それをレシピに変換します。
SQLの場合、ノートブックの「レシピに変換」をクリックします
Pythonの場合、「.pyとしてエクスポート」をクリックし、コードをコピーし、新しいPythonレシピを作成し、コードを貼り付けます（これは将来のバージョンで簡略化される可能性があります）

# Flow navigation
常にフローに戻ってナビゲートする必要はありません。ショートカットボタンがあります。

データセットで、「Parent recipe」ボタンを試してください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/494ac7e9-880c-6090-ffcf-813683bae9f4.png)

レシピで、「出力を入力」をクリックしてから、データセットの名前をクリックして開きます。
ショートカットShift + Aを使用するか、コンパス（作業中のレシピ/データセットの名前の横）をクリックして、ナビゲーターを表示します。

#Rebuilding the flow
##### Rebuilding one element
データセットのビルドにはいくつかの種類があります。
データセットを右クリック、Buildボタンで以下のポップアップウィンドウが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/9f337895-7edb-d0a2-74be-b830612a28d8.png)

- Build only this dataset(図の左側）
　選択されたレシピのみ実行されます。

- Recursive build(図の右側）
  こちらはさらに３つのモードにわかれます。
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/4e030130-3997-8a29-4433-4514acd48a94.png)

    - Smart reconstruction <br>
上流のデータセット（つまり選択しているデータセットの左側にあるすべてのデータセット）に対して、最近変更されたかどうかをチェックし、変更された場合は影響を受ている全データセットも再構築します。デフォルト推奨です。
    - Forced recursive rebuild<br>
    すべての上流データセットを再構築するモードです。たとえば、1日の終わりに実行することで、全データセットを夜間のうちに再構築し、翌日ダブルチェックされた最新のフローで開始することができます。
    - "Missing" data only
    「Smart reconstruction」と同様ですが、データセットが空の場合にのみ（再）構築するモードです。

##### Propagate schema changes
新規項目追加や、特徴量作成実施等のように、フローの途中で、データセットのスキーマを変更する場合があります。そのようなときのために、「Propagate schema changes(スキーマ変更の伝播)」機能が準備されています。

データセットを右クリック⇒[Propagate schema across Flow from here]をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/0676690d-ef0d-ffa7-e6d0-8fe1b769d37a.png)

左下に小さなウィンドウが表示され、フローの色が変わります。ここではtestデータセットに対して実行したため、testデータセットのみが緑で、それ以外がグレーとなっています。ちなみに緑は「OK」、グレーは「未チェック」というように色によって各レシピやデータセットのステータスがわかるようになっています。testデータセットは緑ですがこれより上流にはチェックが入らないため常に緑であり「OK」にカウントされません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/29e124e6-f695-12be-8fdd-46df513e6d9c.png)


Startボタンクリックによりスキーマがチェックされます。
スキーマに問題がないデータセットやレシピは緑色に変化します。
Rやpythonのように自動でチェックが難しいものは、「要マニュアルチェック」扱いになりオレンジ色になります。
「要アップデート」が必要なレシピについては赤色になります。ちなみに、test_prepared_preparedまで作成したあと、test_preparedで1列減らしてビルドしたため、test_preparedとtest_prepared_preparedでデータセットのスキーマに矛盾が起きています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/e3d0507b-a5a4-3e5a-7e61-1c107bd5a91a.png)

test_preparedのスキーマに問題が無いようならば、「ACCEPT ALL CHANGES」押下によりスキーマの変更が下流のデータセットに適用されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/817080a4-29d7-0616-282a-63a90a9ae1b0.png)

ちなみに、pythonやRのような内部のコードを読まないとスキーマの変更がわからないようなものについては、チェックできません。その場合は、フロー上で手動チェックを意味するオレンジ色にレシピが表示され、その先のフローは未チェックを示すグレーとなります。

##### Build from here
フローの途中にあるレシピに変更を加えた場合、そこから下流のみを再計算する機能として、「Build from Here」があります。

データセットを右クリック、[Build Flow outputs reachable from here]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/e896cec5-d9fe-99b8-5982-dc8e839bacc8.png)

下流の依存関係にあるデータセットが、再ビルド対象として一覧に出ますので、問題なければBUILDボタンを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/d8f17ae5-9c31-b2c0-88c4-ae63d9441548.png)

ちなみに、オプションでどのようなBuildを行うか選択可能です。各オプションの意味についてはRebuilding the flowの項をご参照ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106215/b8088860-9e8c-dce4-f220-7be41245a97c.png)


以上です。
Anchoringやflow navigationは地味に便利な感じですね。
あとは、フローを作業ごとの分割するとか、フローがカオスにならないためには非常に大事な気がします。