Power BI データフロー を使ってみる、Premium キャパシティじゃないけど

プレビュー ではあるけれども Power BI データフローを使ってみる。用意した Power BI のライセンスによって機能に差はあるけれども、便利なことは変わりないので。ひとまず、Premium キャパシティがなくてもできる範囲で。それでも結構使える感じ。**Power BI は 必要なデータを 必要な人に 適切な方法で共有するツール**ということをしばらく前に言ってたんだけどやっと理想に近づいてきた感じ。私にとっては可視化ツールではないんですよ、Power BI って。主な機能としてビジュアライズは重要なんですけど。

# 使われやすいデータを準備したい
データって使われないと価値が出ないんですよね。貯めるだけでもと言ってもその方法が決められていなかったりして、タンスの肥やしにもならないんですよ。で、まずは難しい分析とかに至らなくても、これまでどうだったとか比較してどうだとか、すぐに引き出せる準備をしておくところから始めてみてはどうかと思うのです。

## ETL は大変なので楽したい
(E : 抽出) ビジネスデータは大切に管理されているわけで、関係者全員が自由にアクセスできるとは限らないし、(T : 変換) データソースごとに様々なフォーマットが用いられていて、正規化だけじゃなくもしかすると非正規化も考えないとならないし、みんながみんなできることでもないし、できる人であっても毎回同じこと繰り返したりしているのではと思うのです。できるだけ楽にしたい。

## データをどこに置く
ファイルでもデータベースでもどこかにまとめてあげる必要があって、BIツールと密接な状態でデータを参照できるととても便利だよなと。データカタログとか準備されていると必要なデータを探索するってことができるはずなんだけど。

## データを共有する方法
適度にデータマートって必須だと思うんです。データウェアハウスにみんながわーって群がっても使いきれないことが多いだろうし、多種大量でどれを探しているものはなんなのか迷うし。営業が必要なもの、経理が必要とするもの、人事が必要とするもの、そもそも目的が違ってメッシュも異なるので。

## そんなこんなで Power BI データフロー
組織全体で使うもよし、チーム単位で使うもよし。さっと始められていいんじゃないかなと。もしダメだったら損失少なくやめることもできるわけだし。

- 繰り返し使われることが多いもの
- 大量にあるが更新されることがないもの
- 更新や追加され続ける最近のもの

これまで一緒くたにロードしなければならなかったのが、データの特性に合わせて整理したうえで共有できるというのがメリットなんじゃないかな。

# Power BI データフローに必要なもの
Power BI データフローを配置できるのは アプリのワークスペースのみ。だから Power BI Pro が必須。

- データを共有するデータフローを構成する
- 共有されたデータフローのデータをデータセットにインポートする

など
# Power BI データフローを利用する
まぁいろいろあるけれども、使うことができるところから。

|データフローの機能 | Power BI Pro |   Power BI Premium |
|---------|:---------:|:---------:|
|スケジュールされた更新| 8 回/日|  48|
|合計ストレージ| 10 GB/ユーザー  |100 TB/ノード|
|Power Query Online でのデータフローの作成|    +   |+|
|Power BI 内でのデータフローの管理|   +|  +|
|Power BI Desktop でのデータフロー データ コネクタ|  +|  +|
|Azure との統合|    +|  +|
|計算されたエンティティ (M によるストレージ内変換) | |   +|
|新しいコネクタ|    +|  +|
|データフローの増分更新|  |   +|
|Power BI Premium 容量での実行/変換の並列実行|   |   +|
|データフローでリンクされたエンティティ| |        +|
|Common Data Model の標準化されたスキーマ/組み込みのサポート|  +|  +|
さきにどう使うかの内容から。
## Power BI デスクトップでレポートを作成
データフローをソースにする Power BI レポートを作成するには Power BI デスクトップを利用する、いまのところは。
レポートを発行できるのだから、Excel でもサポートしてくれればよいのにな。
### データをロードする
Power BI デスクトップにPower BI データフローをサポートするコネクタが追加されたと考えればよいだけで、難しく考える必要はない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/7533f896-bc64-6447-6a25-3a3dc9213ee9.png)
アカウントを用いたコネクタの認証を完了すると該当アカウントが参照できるデータフローとエンティティの一覧でき、必要なエンティティを選択(複数可)しデータモデルに読み込むだけ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/a668c549-fb65-c3aa-a367-b423f3cdb793.png)
**[読み込み] を押下しない方針で**
データフローの構成時に変換変形はほぼ完了しているはずだけれども、さらに調整したりする必要がある。データ型については特に。なので、いきなりデータモデルに読み込むのではなく、Power Query エディターで再調整なり、不要なものを除外するなり、足りないものを追加などすることになる。

**特別なデータソースではない**
データソース、ここではデータフローのエンティティとなるが、Power Query エディターによる加工がデータソースに影響することはないので必要なだけフィルターやマージ、アペンドなどすればよい。また、同時に利用するほかデータソースとのマッシュアップも自由。

### レポートの発行先
Power BI データフローをデータソースに持つレポートの発行先は、マイワークスペース / アプリのワークスペースいずれでも構わない。で、データフローが配置されたアプリのワークスペースでなくても構わない。なぜなら、レポート(データセット)を発行したアカウントでデータソースであるデータフローにアクセスすることになるから。そして、レポートの参照するつまりデータセットを参照するアカウントの管理とデータソースを参照するアカウントの管理は別だから。
## データセットの更新
Power BI データフローはインポート モードのみ。
Power BI サービスにインポートしたデータセットは他コネクタ同様にデータセットの更新を行うことができる。レポート(データセット)を発行したアカウントで自動的に設定されるので、特別な手順は不要。

# Power BI データフローを作成
あらかじめ作成されているアプリのワークスペースに データフローを作成する。Office 365 グループベースの ワークスペースでも可だけどここでは利用しない。なぜならデータフローの機能に制限があるから。Power BI データフローもプレビューだし、新しいワークスペースもプレビューだし。
## データフローの新規作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/c26ebc54-323a-706d-23c0-101a859a3951.png)
アプリのワークスペースに対しデータフローを複数配置することができ、データフローには複数のエンティティを配置することができる。
データフローは スケジュール更新を設定することができ、データフローに含まれるエンティティすべての更新が試行される。

**オンプレミス データ ゲートウェイは利用可**
オンプレミス データ ゲートウェイを利用しローカルネットワーク内のデータソースにアクセスは可能。ただし、パーソナルモードは利用できない。そして、データフローごとで利用できるオンプレミス データ ゲートウェイはひとつ。エンティティの設定ではなくデータフローの設定ということ。オンプレミス データ ゲートウェイを使うデータフローとオンプレミス データ ゲートウェイを使わないデータフローで分けて使う感じになりそう。

## データフローにエンティティを定義
作成されたデータフローはからっぽなのでエンティティを追加していくことになる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/b6a9706e-e847-e2ee-d396-85cd04e17286.png)
**新しいエンティティの定義**
新規の時くらいはこれを使う。

**その他のデータフローからエンティティをリンク**
リンク(参照)したエンティティを追加するにはこちらからなのだけど、これでなくてもよくて、エンティティの追加で "Power BI データフロー コネクタ" を選択するだけ。

**外部 CDM フォルダーをアタッチする**
Power BI データフローが標準で提供するストレージを使わないときに。
エンティティを追加するということから離れていて、データフローが利用するストレージを持ち込みのAzure Data Lake Storage Gen2 への変更をはじめ、他Azure のリソースを利用するための設定。これはまだ触れていないのでそのうちに。

[Power BI Dataflows and Azure Data Lake Storage Gen2 Integration Preview | Microsoft Power BI ブログ | Microsoft Power BI](https://powerbi.microsoft.com/ja-jp/blog/power-bi-dataflows-and-azure-data-lake-storage-gen2-integration-preview/)

### 新しいエンティティの定義
新規で作成したデータフローは空っぽなので、エンティティを追加していく
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/3108845e-1b3d-34a5-00f3-f2ebf979c64b.png)

すでに用意されたコネクタから必要なものを選択し進むだけでよい。Power BI デスクトップ や Excel に比べコネクタは少ないけれど、いずれ増えていって同様になるといわれている。まぁ気長に待てばよいし、すでに用意されているものでも十分といえば十分。
まだ予定ではあるけれども、ここにテンプレートが追加される模様。テンプレートとは よく使われているサービスに接続するコネクタを持ち、適する変換加工などが設定された Power Query ということ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/e4ca3883-562a-620e-a467-8d74c2a0bda6.png)
Power BI デスクトップの Power Query エディターの操作感とはいかない。ちょっとした工夫は必要かと。また、加工をしている間に "予期せぬエラー" がわりと多いので、Power BI デスクトップでスクリプトを作成し、[空のクエリ] に詳細エディターにペーストすると思いのほかうまくいく。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/c78d5013-9360-f244-8c5b-5c145a690adb.png)
Azure SQL Database への接続
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/5d89955e-32bf-e8d5-74d6-a4abc6079c4f.png)
テーブルの一覧から必要なものを選択し、[次へ] 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/f3769699-3494-564f-724e-563387730738.png)
データフローに保存できるデータは スカラ値のみなので、CSVファイルに保存できるデータ型と考えておけばよい。まぁ実際にCSVで保存されるのだけど。
エディター上のプレビューの段階でデータ型の変換など必要なのは、[binary], [table], [list], [record]など。必要なものは展開や変換し、不要なものは除外することが必要。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/a46b8896-cdfb-b58e-4ba3-c775bc0a5e39.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/c56015d6-6c2d-01a8-5b6d-d3cd63197b13.png)

使うことがなかったもしくは不要になったクエリは削除する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/6bf34b31-5a02-86c9-67f7-e359b538eceb.png)
変換が完了したらデータフローを保存する。保存後の最初の更新で初めてデータフローのストレージに収集されたデータが保存される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/427c36fd-d50f-7a20-91be-56a6fccd9369.png)
データフローのスケジュール更新はデータセットの更新と同じスタイル。まぁ難しいことはないでしょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/be96100c-4ec9-d2b3-37ad-ef87d4b44f49.png)


### その他のデータフローからエンティティをリンク
すでに存在しているデータフローのエンティティを参照するエンティティを作成することもできる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/2eb7dadf-872e-05d6-0ab2-d2afd40cd669.png)
こっちからでもOK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/1088f556-5c00-1bb8-2b67-58e66a8343ff.png)
オンプレミス データ ゲートウェイを使うことはないけれども。いずれにせよサインインしていることが必要。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/8a23ee5b-bb5a-fda5-c3b2-6b6cf66ec164.png)
ここで選択できるエンティティは、サインインしているアカウントが参加している アプリのワークスペースのみ。そして、Office 365 グループベースのアプリのワークスペースのデータフローは対象外。そもそも、Office 365 グループベース のアプリのワークスペースで 他ワークスペースのエンティティを参照ができないのです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/f3bf37f6-4f5c-5873-17f6-5d4853bba649.png)
**リンクされたエンティティの変更はできない**
適用するステップの追加などができない。

**リンクされたエンティティを更新するには Premium が必要**
リンクしたエンティティを使った更新ができないということだけなので、リンクしたエンティティを使うことは Premium キャパシティでなくても可能
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/dd95c8bd-4f60-b5e2-9d03-8744ddf95753.png)
なので、リンクしたエンティティを参照し、新たにエンティティを追加。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/ddb4ace1-056b-f58b-372d-3191fc22f4cf.png)
**計算されたエンティティ Premium が必要**
更新するためには Premium キャパシティであることが必要ということであって、参照したエンティティによる更新がなければ Premium キャパシティでなくてもよい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/3253a42c-200d-ab34-7aa4-2d1d27a98756.png)
リンクしたエンティティを参照したエンティティを作成し、参照元となったエンティティの読み込みを無効にすればよいだけの話。削除はできない。読み込みされないエンティティはデータフローのエンティティにリストされない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/88144f1a-7bbb-b6ea-f571-2bc61c42e04b.png)

# ややこしポイントについて
**リンクされたエンティティ1**
> **リンクされたエンティティを変更することはできません。**クエリに加えられた変更は保存されません。

これは仕様ということでしょう。リンクされたエンティティではデータがコピーされることはなく、ポインタのみ存在するといった感じでしょうか。

**リンクされたエンティティ2**
>**リンクされたエンティティを更新するには Premium が必要です。**更新を有効にするには、このワークスペースを Premium 容量にアップグレードするか、このエンティティを削除してください。

なにを更新の対象としているかなのだけど、データフローの更新のことを指しているかと。Premium キャパシティでかつ同一ワークスペース内でリンクされたエンティティの参照元エンティティを含むデータフローが更新されたとき、データ リネージュ的なものに従い参照先エンティティを含むデータフローも自動的に更新してくれるのです。ホップ数は5までですけど。

**計算されたエンティティ**
>**更新するため、計算されたエンティティでは Premium が必要です。**更新を有効にするには、このワークスペースを Premium 容量にアップグレードするか、このエンティティを削除します。

Excel ワークシートと同じような動作で、参照元セルが更新されたとき、参照先も更新される的な感じ。リンクされたエンティティは、そのまま利用するか、適用するステップを追加していくにはデータフロー内でリンクされたエンティティを用いるようなものですし。
in-storage computations と表現されるらしいのだけど データフロー内で新たなエンティティを出力するってことは Premium キャパシティのみってことかな。

**所有者だけが管理できる**
権限などあれば削除はできるのだけど "編集" ができないのです。共同編集が望ましい思わないからよいのだけど、所有者が存在しなくなったというシナリオではどうするか。現状の UI ではインポートはできないけれど、API 経由でできるんじゃないかな。データソース接続の認証情報を取り出す手段はないのでいずれにせよ新たにセットアップする感じになってしまうだろうけど。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/569c4a0d-a575-e0f8-ef2c-888b2c949775.png)


# その他
- [Power BI データフロー を試せる環境を構築する](https://qiita.com/PowerBIxyz/items/efb08f66cf42e2d27f18)
- [Power BI データフロー を使ってみる、Premium キャパシティで](https://qiita.com/PowerBIxyz/items/ac77b1239d2a02712fbb)
- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
- [Excel で Power Query を使い始めるには](http://qiita.com/PowerBIxyz/items/52e563037b855a099ca9)