[Power BI] PBIXファイルをデータモデルとビジュアルに分割してCI/CDしよう😁

# はじめに

Power BI勉強会のGW合宿にて、**Power BI Report Ops**と題して発表した内容の一部になります。

https://speakerdeck.com/hanaseleb/power-bi-report-ops

## こちらの記事を併せて

こちらの記事が併せて読んでいただくとよいかと思っています。ぜひ読んでみてください。

#### SharePointまたはOneDriveを使用したCI/CD

https://qiita.com/hanaseleb/items/a51ff75aba7b238621ec

# まずはPBIXファイルの中身を考える

Power BI Desktopでレポートを作成し、Power BI Serviceに発行をすると、

- レポート
- データセット

がワークスペース上に作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/9cedc588-5506-c5fe-3ae9-c31eb39ed5c9.png)

つまり、データをインポートしたうえで作成したPBIXファイルを想定すると、その構造は下記のようになっていると考えることができます。

- データセット
    - データモデル
    - インポートデータ
- ビジュアル

# データモデルとは

データモデルは、データの取得先情報やカラム構成、書式などのメタデータのことで、データ自体は内包していません。メジャーの定義や、計算列、計算テーブルなどの定義もすべてデータモデルに記述されています。

TabularEditorなどの外部ツールを使用することで直接アクセス・取得することができ、Json構造をした**bimファイル**として保存することも可能です。

ここについては別記事でも少し触れています。

https://qiita.com/hanaseleb/items/df7891a213f14d62db8d

https://tabulareditor.com/

Model.bimファイルは下図のようなJson構造をしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/f7de2ed6-a02b-7f3b-3f43-4fd187d3ed7f.png)

## データモデルはテキスト（Json）→差分管理しやすい

つまりデータモデルはテキストベースで保存ができるため、Githubなどのツールを使用した差分管理が非常にしやすいものだという理解をすることができます。

# ビジュアルデータ

一方、ビジュアルについては構造も含めて公開されておらず、アクセスすることはできません。ごにょごにょ（zip化）すればデータに触ることはできますが、改変することは現状難しいです。

## ブラックボックス

ビジュアルデータは構造がわからないデータになっており、差分管理などを行うことは不可能でブラックボックスです。チームでPBIXファイルを管理していく場合、SharePointやOneDriveなどのクラウドストレージを使用してバージョン管理を行うことが必要になります。

# ビジュアルとデータの分け方

任意のPBIXファイルを用意します。

- PBIXファイルを保存し、ファイルを複製し2つにする。
- ファイル名を「○○_Data.pbix」と「○○_Visual.pbix」にわける

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/d8baacb5-78eb-255c-e661-f22fad632127.png)

- データモデルのみにするファイル（○○_Data.pbix）はビジュアルをすべて削除して保存する。
- Power BI Serviceに発行する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/1ae3a141-1968-1173-f357-5bba9f640c3e.png)

- ビジュアルのみにするファイル（○○_Visual.pbix）はデータをすべて削除する。
- 先ほど発行したデータセットにライブ接続をする。

一度データを削除した時点でビジュアルはエラーがでて非表示になりますが、データセットに接続するとビジュアルは復活します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/ba884d02-50a3-60e5-d48e-74ac7fb92a44.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/d51b1206-79be-45aa-2e08-7d8b0494f341.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/e054f8e3-6ee8-68eb-2d78-d21f46ece1e4.png)


# なぜデータモデルとビジュアルを分割するのか

ここまで作業として行ったうえで、なぜデータモデルとビジュアルを分割したほうがいいのか。

以下2点が主な理由としてあげられます。

1. データモデル開発者と、ビジュアル開発者が別になることが多い
1. データセットの再利用を促進

MS Docsの下記ページにも以下のような記述があります。

>レポートとダッシュボードの開発からモデル開発を分離する
エンタープライズ規模のデプロイでは、データセットの開発とレポートとダッシュボードの開発を分離することをお勧めします。 レポートまたはデータセットにのみ変更を昇格させるには、デプロイ パイプラインの [選択的デプロイ] オプションを使用します。
>このアプローチは、データセットとレポート用に個別の PBIX ファイルを作成して、Power BI Desktop から開始する必要があります。 たとえば、データセット PBIX ファイルを作成し、開発ステージにアップロードすることができます。 その後、レポート作成者は、レポートに対してのみ新しい PBIX を作成し、ライブ接続を使用して公開されたデータセットにこれを接続することができます。 この手法を使用すると、個別の作成者がモデリングと視覚化を別々に処理し、個別に運用環境にデプロイすることができます。
>共有データセットがあれば、このメソッドを複数のワークスペースで使用することもできます。

https://docs.microsoft.com/ja-jp/power-bi/create-reports/deployment-pipelines-best-practices#separate-modeling-development-from-report-and-dashboard-development

またTwitter上で @ryoma-nagata さんが下記のような発言をしていました。

https://twitter.com/ryomaru0825/status/1532909565616205825?s=20&t=oKAw5J7SW86miy5lfJJuIg

データモデルを作成する人とビジュアルを作成する人は最終的には分離していく場合が多いと感じています。ビジュアルを作成する人はより現場・ビジネスに近い人で、日々自分たちが見やすいかたちにビジュアルを作り替えていきます。一方データモデルを作成するためにはメジャー（DAX）やデータ準備（Power Queryなど）、モデリングの知識が必要で、どちらかというとデータエンジニア側の人が担うことが多くなります。その場合に開発が競合してしまったり、最新バージョンがどちらかわからなくなってしまうことを防ぐことができます。

また、データセットが氾濫することを防ぐというのはエンタープライズ要件では非常に重要です。自由な環境をつくると、どこかで間違ったメジャーがかかれたデータセットがうまれ、間違った数値・集計で可視化をされたレポートが広まる可能性があります。ビジュアルはビジネス側に自由に任せるにしても、データセットはある程度管理下におかなければいけないシーンも増えてきます。正しいデータセットのみを使用してもらうためにも、データモデルの分離が必要になってくるわけです。

# Power BI Report Opsまとめ

Power BI を複数人で管理する場合には、データモデルとビジュアルを分けて管理するのがおすすめです。その分けたファイルをさらにどうやって管理するのかも難しいポイントです。

Docsでは比較的簡単に導入できるSharePointやOneDriveを使用する方法や、AzureDevOpsを利用する方法も紹介されています。

デプロイパイプラインも含めて、組織によって最適解は違うと思うので日々研究ですね。

## 参考リンク

https://speakerdeck.com/hanaseleb/power-bi-report-ops

https://qiita.com/hanaseleb/items/a51ff75aba7b238621ec

https://docs.microsoft.com/ja-jp/power-bi/create-reports/deployment-pipelines-automation