Power BI データフロー を使ってみる、Premium キャパシティで

Premium キャパシティにない Power BI データフローでもそこそこいい感じにつかえるけれども、Premium な機能も使ってみる。Power BI Premium では、SharePoint Online サイトとか組織内のWebアプリにレポートを埋め込んで共有したり、Power BI アプリを介しすべての Power BI アカウントに向けて共有したり、ライセンス周りに大きなアドバンテージがあったのだけど、Power BI データフローでそのコスト差が埋まってきた感じがしないでもない。

- リンクされたエンティティによるデータフローの更新
- エンティティの増分更新
- 専用に割り当てられたリソースによる並列実行

ひとまず、これら3点について使い方や気になった点のまとめ。
他に注目な Power BI データフローに組み込まれた Machine learning ってのもあるのだけど、まだ先の話(CY '19 - Spring)なのでそっ閉じ。Azure integration はもう少ししたらかな。

# リンクされたエンティティによるデータフローの更新
[Power BI のデータフロー間でエンティティをリンクする (プレビュー)](https://docs.microsoft.com/ja-jp/power-bi/service-dataflows-linked-entities)
プレビューですし、リンクつけておくなど。

同じワークスペースの中でエンティティを参照するデータフローを何段か作った。これがリンクされたエンティティなのだけど、ここでは、計算されたエンティティと他データソースなどを利用するエンティティを追加していない。簡単に試すだけなので。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/6b47f870-8936-7b51-0ae5-d247111c82b2.png)
Gen1からふたつに分岐してそれぞれリンクされたエンティティを持つデータフローを用意した状態。で、それぞれ個別に用意したので "最終更新"が異なっているのです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/da5a49cc-e87c-64bd-28cc-bace1b663729.png)
Gen1を更新、ここではオンデマンド更新をすると Gen1を参照 もしくは データリネージュ的な子孫となるデータフローも更新されるのです。すべてがリンクされたエンティティなので更新に時間を要することもなく"最終更新" 時間が一致してる。途中のデータフローに計算されたエンティティなど他エンティティが存在したときもう少し時間が経過することになる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/d099b6aa-c91a-1a47-1977-f2a473efcbce.png)
更新履歴を参照すると "リンクされたソース" によるデータフローの更新であったことが記録される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/86f698ec-5452-a647-3d80-5c6040c26f2f.png)

データフローの更新でさらにデータフローを更新することができるので、データリネージュの維持が比較的簡単にできるようになっているっていうこと。で、途中のデータフローに含まれるエンティティがさらにリンクされたエンティティで参照されているときも別途の動作をすると。

- データリネージュが循環参照
- ホップ数が5を超える

ときにはこの更新機能は失敗に終わる。で、更新を伝搬させないためには、リンクされたエンティティの読み込みを無効にすればよい。

[Power BI のデータフロー間でエンティティをリンクする (プレビュー) - データフローからレポートを表示する場合のアクセス許可](https://docs.microsoft.com/ja-jp/power-bi/service-dataflows-linked-entities#permissions-when-viewing-reports-from-dataflows)
ここわかりにくかったのだけど、こういうこと。
他ワークスペースからリンクしたエンティティ用意されているとき
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/ca7ecfbf-20bc-836c-b709-ee5b32d4aa8f.png)
リンク元のワークスペースに参加していない、つまり、データフローを参照することができないとき、リンクされたエンティティを参照することはできない。ただし、計算されたエンティティを利用することは可能。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/a868eb2c-0f67-bd63-3d9a-8e9a32887d78.png)
リンク元のワークスペースに参加している、つまり、ソースのデータフローを参照できる場合、リンクされたエンティティも利用することができる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/d9598006-baf1-421c-307b-c6386266ecf2.png)

# エンティティの増分更新
データセットでも利用できる増分更新と変わらないので難しいことはない。いわゆる UPSERT ではない。で、エンティティごとの設定なのです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/ecf2d597-ad01-e40b-a55b-5662284e9f6c.png)

**フィルタに利用される列**
増分であることのフィルター条件に利用されるのは、日付/時刻 型 なので、 Power Query でいうところの DateTime.Type に変換しておく必要がある。
**保存される行**
数値 : 1 ~ 120
単位 : 年 / 四半期 / 月 / 日

**更新される行**
数値 : 1 ~ 120
単位 : 年 / 四半期 / 月 / 日 ※保存される行で指定した期間単位より短い期間単位であること
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/24e44f8b-3dfc-4fb5-7354-d9813e46f764.png)

en-us 以外の環境だと表示がよろしくないけれどもこんな感じに。

>これらの設定を保存すると、このデータフローが次に更新されるときに、過去 3 年間 のデータがデータフロー ストレージに読み込まれます。以降の更新では、過去 5 日間 に変更されたデータのみが更新されます。

>When you save these settings, data from the past 3 years will be loaded to your dataflow storage the next time this dataflow is refreshed. Subsequent refreshes will update only data that's changed in the past 5 days.

**データ変更の検出**
フィルタに使用する列をもうひとつ追加。更新対象のうち更新対象範囲内でさらに更新されたと考えられる行のみを追加するっていうこと。使いどころはよーく考えておけばよいか。

**完了期間のみ更新**
更新される行の期間が "月" であるとき、当月1日から当日までを含めるか否か。

## 増分は差し変わる感じ
"更新"というよりは差し替えられる感じ。
データフローのストレージである Azure Data Lake Storage Gen2 にどのように保存されているかは、model.json をみるととてもよくわかる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/7aca5a9e-959d-53e7-701d-1c95ac9ab44a.png)

- できるだけファイル数が少なくなるように構成(パーティション)される
- 増分は "日" 単位 もしくは 更新される行で指定した単位
- データフロー更新時、保存される行で指定した単位まで適宜おまとめ
- 保存する行で指定した範囲を超えるとき、ファイル単位(パーティション)でさよなら

Fiscal Year っぽい対応には 四半期とか使う感じかな。とはいえデータフローだけで対応する必要はないのだけど。

# 専用に割り当てられたリソースによる並列実行
[Power BI でのセルフサービスのデータ準備 (プレビュー) - Power BI Premium でデータフロー機能](https://docs.microsoft.com/ja-jp/power-bi/service-dataflows-overview#dataflow-capabilities-on-power-bi-premium)

可能であればエンティティはパラレルで処理されていくって話。Premium じゃないキャパシティは共有リソースなので、騒々しいご近所さんに影響を受ける可能性もあってどうしても時間を要すると。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/16db5dd7-2880-a60b-92c4-e9b2ab7565d0.png)
例えば、Azure SQL Database に いくつかのエンティティが抽出を試みるとき、ここでは4つすべてがパラレルで抽出⇒変換まで実行され素早く更新が完了した。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/ebebfd95-2b15-6271-0b15-1592e2e7181f.png)
なんでこんなに差がつくのさって感じではあるんだけど、共有リソースなので仕方がない。占有で利用できるリソースが割り当てられるのが Premium なキャパシティであるから。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/76269de5-21e8-9b39-b4ae-1ae978cb67c9.png)

# その他
- [Power BI データフロー を試せる環境を構築する](https://qiita.com/PowerBIxyz/items/efb08f66cf42e2d27f18)
- [Power BI データフロー を使ってみる、Premium キャパシティじゃないけど](https://qiita.com/PowerBIxyz/items/4ef60631bee8f8ec62a4)
- [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)