Power Platform Day Winter '19 : データフローでデータを準備する

この記事は [Power Platform Day Winter '19](https://power-platform.connpass.com/event/149834/) C-4 : Data Flow 101 で話す内容についてまとめています。

# データフローとは

2019 年 12 月時点で私が認識する限り以下の 3 つがあります。
※尚、英語表記では Data Flow, dataflow, dataflows など揺れがありますが、検索するときは dataflow で大丈夫です。

- [Azure Data Factory データフロー](https://docs.microsoft.com/ja-jp/azure/data-factory/concepts-data-flow-overview)
- [Power BI データフロー](https://docs.microsoft.com/ja-jp/power-bi/service-dataflows-overview)
- [Power Platform データフロー](https://docs.microsoft.com/ja-jp/powerapps/maker/common-data-service/create-and-use-dataflows)

いずれも GUI ベースのローコードで **Extract, Transform, Load (ETL)** を実現する機能を提供しています。

## ETL

Extract: データを Excel や SQL サーバー、Databricks などのデータソースから取得する。
Transform: 取得したデータを集計や分割、型変換など、必要に応じて変換する。
Load: 変形したデータをデータの格納先に保存する。

# なぜデータフローが必要か

それぞれのサービスによって少し背景が異なります。

## Azure Data Factory (ADF) のデータフロー

Power Platform ではありませんが、データフロー繋がりで紹介します。

ADF は Azure が提供する ETL/ELT サービスであり、パイプラインを GUI で定義できるオーサリングツールです。そのためデータ変換のプロセスは Databricks や SQL Server など実行環境が必要であり、ADF からは実行環境に対してデータを受け渡すことしかできませんでした。

しかし ADF 内でもデータ変形を定義できるようにするため、Azure Data Factory データフローが追加されました。
※実際の処理は別途 VM が実行環境として使われる。

ADF はもともと Extract と Load の機能を持っているため、Azure Data Factory マッピングデータフローはデータ変換の部分のみ提供します。また ADF のデータフローは、現時点で以下の 2 種類があります。

### ADF マッピングデータフロー

マッピングデータフローでは集計や分割、結合などの各処理をキャンバス上にそれぞれ**変換ストリーム**という単位で配置していきます。
[キャンバス]
![](https://docs.microsoft.com/ja-jp/azure/data-factory/media/data-flow/hideg.png)
[変換ストリーム]
<img width=400 src="https://docs.microsoft.com/ja-jp/azure/data-factory/media/data-flow/canvas2.png"/>

### ADF ラングリングデータフロー

[ラングリングデータフロー](https://docs.microsoft.com/ja-jp/azure/data-factory/wrangling-data-flow-overview)では、みんな大好き [Power クエリー](https://docs.microsoft.com/ja-jp/power-query/power-query-what-is-power-query)が使えます。Power クエリーは、以前から Excel で活用されており、最近では Power BI でも使われる例のあれです。
![](https://docs.microsoft.com/en-us/azure/data-factory/media/wrangling-data-flow/tutorial6.png)

## Power BI のデータフロー

Power BI でデータを利用する場合、いくつか課題があります。

- Data Warehouse の柔軟性が足りない
- データセットの柔軟性が足りない

**Data Warehouse (DWH) の柔軟性が足りない**

会社や組織全体で利用するために用意された DWH には大量のデータがあるものの、個人やチームでデータを分析する場合にいくつかの理由でデータが不足することがあります。

- 手元にあるデータや他のデータソースを追加したい
- 計算列を追加したい

Power BI のデータセットはこれらの問題を解決する機能があり、Power BI ユーザーはデータを取得する場合、同時にデータを Power クエリーで変換したり、他のテーブルと結合したりしてきました。

**データセットの柔軟性が足りない**

作成したデータセットは pbix ファイルに紐づいていることからいくつか制限があります。

- 他データセットを参照できるが、追加や削除、または他のデータソースを使うなど内容を変更できない
- データセットの定義をコピーした場合、管理性が下がる
- Machine Learning サービスなどでデータを使いたい場合にデータセットが再利用できない

Power BI データフローを使うとこれらの問題が解決できます。

Power BI データフローはデータセットの前段階のコンポーネントとして機能し、ユーザーが自分でデータを集めてくることができるレイヤーを提供します。

![](https://docs.microsoft.com/en-us/power-bi/media/service-dataflows-overview/powerbi-dataflows_01.png)

**他データセットを参照できるが、追加や削除、または他のデータソースを使うなど内容を変更できない**
- データフローはデータセットを同じ機能でデータスキーマと変換を定義できる
- データフローをデータソースにして、そこからデータセットを作れるため柔軟性を確保できる

[データセットをデータソースにした場合]
データの取得やクエリの編集などすべてができない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/26d15413-3adf-2bb6-a3cd-94301a502274.png)
[データフローをデータソースにした場合]
新規にデータセットを作った場合と同じように、すべてを編集できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/1b3c0430-63ba-4903-5220-58e28c7b88d5.png)

**データセットの定義をコピーした場合、管理性が下がる**

データフローはデータセットと同じ Power クエリーが使えるため、データセットをデータフローに一元化できる。
[データセットから作っている場合]
二つのデータセットが別れて存在しているため、片方を変更した場合に、もう一方は変更が反映されない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/e0c9b50c-a30d-b27a-6336-147480418d43.png)
[データフローからデータセットを作っている場合]
二つのデータセットが一つのデータフローにつながっているため、変更はデータフローで行えば両方のデータセットに反映される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/bbf59066-42f9-cea9-3fb3-bc9b21202d06.png)

**Machine Learning サービスなどでデータを使いたい場合にデータセットが再利用できない**

データフローのデータ保存先を Azure Data Lake Storage Gen2 にすることができます。また出力されたデータは Common Data Model に基づく形式で保存されるため、再利用性が高くなります。詳細は [データフロー ストレージ用の Azure Data Lake Storage Gen2 の接続](https://docs.microsoft.com/ja-jp/power-bi/service-dataflows-connect-azure-data-lake-storage-gen2) を参照してください。

### Power BI データフローの作成

基本的に、Power BI データフロー作成は定義の作成であるため、データフローの作成後、データの読み込みを行う必要があります。自動リフレッシュの設定はデータセットより頻繁に行えるなど機能的に有利な点があります。

現時点で以下の 4 つの方法でデータフローを作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/da06fec6-1517-3bbf-9d17-27b91d7b6625.png)

**新しいエンティティの定義**
現在のデータセットと同じ作り方でデータフローが作れる、一番基本的なパターンです。データのスキーマはこれまで通り自分で設定することもできますし、Common Data Model の標準エンティティのスキーマにマップすることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/daa24b93-e09d-4e59-2238-ccf4b8cbbfa0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/78a07a86-a580-4997-3250-e491874400b5.png)

**その他のデータフローからエンティティをリンク**
複数のデータフローからエンティティを参照するデータフローを作りたい場合に使います。以下の例では Customer データフローから Account エンティティを、SpeakerList データフローから SpearkerList エンティティをリンクしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/91e1c2dc-f0c7-f3a5-dae2-252d44aa272a.png)

尚、リンクを使う場合はプレミアムが必要となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/a98822f4-7687-c00c-6c89-2acb788bb5fe.png)

[参照: Power BI のデータフロー間でエンティティをリンクする](https://docs.microsoft.com/ja-jp/power-bi/service-dataflows-linked-entities)

**モデルのインポート**
データフローの定義を再利用したい場合、エクスポートしたモデル定義を読み込むことができます。
[モデル定義 json のエクスポート]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6d47aa8b-7f16-6e04-f234-b6e832dc0fef.png)
[データフロー作成でモデルをインポート]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/546eff32-efaa-39de-c6d1-e439ca7a8d99.png)

**Common Data Model フォルダーのアタッチ**
既に Azure Data Lake Storage Gent2 に Common Data Model 形式でデータがある場合、データごとアタッチすることができます。これは他の方法と異なり、フローの定義もデータのロードも必要がなく、すぐにデータが使えるメリットがありますが、データの管理は Power BI 側ではなく、Azure 側となります。

## Power Platform のデータフロー

Power Platform のデータフローは、Common Data Service の機能として提供され、Power Apps や Power BI での利用の他、Azure Data サービスや AI サービスなど、他のビッグデータを必要とするサービスからもデータを使う事を目的としています。

[参照:データフローでセルフサービス データを準備する](https://docs.microsoft.com/ja-jp/powerapps/maker/common-data-service/self-service-data-prep-with-dataflows)

Power Platform のデータフローは以下 2 つの出力先をサポートします。

- Common Data Service
- Azure Data Lake Gen2 の Common Data Model フォルダ

Power BI データフロー同様、データソースは各種コネクタが利用でき、データ変換は Power クエリが使えます。

### Azure Data Lake Gen2 との接続

Azure Data Lake Gen2 は Azure 側のリソースであるため、事前の準備が必要です。詳細は
[Azure Data Lake Storage Gen2 をデータフロー ストレージに接続する](https://docs.microsoft.com/ja-jp/powerapps/maker/common-data-service/connect-azure-data-lake-storage-for-dataflow)を参照してください。

尚、考慮事項と制限に重要なことが記述されているため、確認してから作業を行ってください。
> **考慮事項と制限**
データフロー ストレージを使用する際に留意すべき考慮事項と制限がいくつかあります。
データフロー ストレージ用の Azure Data Lake Store Gen2 アカウントのリンクは、既定の環境ではサポートされていません。
データフロー ストレージの場所をデータフロー用に構成したら、変更することはできません。
既定では、環境のどのメンバーも Power Platform Dataflows Connector を使用してデータフロー データにアクセスできます。 ただし、データフローの所有者のみが Azure Data Lake Storage Gen2 のファイルに直接アクセスできます。 追加のユーザーがレイクのデータフロー データに直接アクセスすることを承認するには、Data Lake 内または Data Lake 自体のデータフローの CDM フォルダにそれらのユーザーを承認する必要があります。
データフローが削除されると、レイクの CDM フォルダも削除されます。

# Power BI Desktop からの読込み

最後に作成したデータフローを Power BI Desktop で読み込みます。
最新のツールでは、以下のように Power Platform カテゴリが追加されており、これまでの Power BI データセットとデータフローに加え、Power Platform データフローと CDS が追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/edf6319c-9c1b-5e3e-2298-a76d54079d25.png)

## Power BI データフローの読込み

接続時にデータフローがあるワークプレースを選択して、データフローを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/f7ac4ab0-1450-69d8-e050-cf34ca180a3f.png)

## Power Platform データフローの読込み

接続時にデータフローがある環境を選択して、データフローを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/cf22b8a8-9640-01df-bc90-6f7561295517.png)
※ Power Platform データフローには Power BI データフローも出てきます。

# まとめ

データフローを使えば、これまで一つの pbix や PowerApps アプリに閉じていたデータソースが、より柔軟にかつ強力に利用、共有できます。またデータの重複や不整合もなくなり、より精度の高いデータを利用できるため、是非手元の環境でも触ってみてください。