Power BI のデータセットとデータフローとデータマート

Power BI には「データセット」「データフロー」「データマート」のざっくり３種類のデータストアがあります。この順番で登場してきたのですが、それぞれどういったものなのかを私なりに整理したいと思います。

まずはこの３種類を絵に表したものがこちらです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668909/577f05b0-090e-5cb5-0131-425d7b3cc633.png)

データセットは、データソースとの接続方式として DirectQuery かインポートかを選択可能となりますが、データフローとデータマートは必ずインポートとなります。

# データセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668909/4bfe6031-023f-cab6-379c-9903bf16fe54.png)
Power BI レポートにはデータセットが必須です。データセットは (データマートから自動作成されるものを除いて) Power BI Desktop で作成する必要があります。Power Query エディターにてデータソースの種類を選択して作っていきます。基本的には「インポート」モードでデータソースからデータを取得して Power BI 内に保持しますが、データベースなどは [「DirectQuery」がサポートされており、](https://learn.microsoft.com/ja-jp/power-bi/connect-data/power-bi-data-sources) 都度クエリを発行する (Power BI 内にデータを保持しない) よう設定することも可能です。
データセットはカラムストア型のインメモリ データベースとして動作します。カラムストア型なので、列ベースでデータの圧縮を行います。(圧縮方法などの詳細はこちらの Microsoft の公式本 [The VertiPaq Engine in DAX](https://www.microsoftpressstore.com/articles/article.aspx?p=2449192) に書かれていそう。)
データ型とカーディナリティ (値のばらつき。「性別」なら男・女・未回答の３種類でカーディナリティは低い、「売上金額」ならその取引ごとにバラバラになるのでカーディナリティは高い。) によって圧縮率は変わるので、**どのくらい圧縮されるかはやってみないと分かりません。** ドキュメントでは、うまくいくと 1/10 くらいになると言っています。

https://learn.microsoft.com/ja-jp/power-bi/guidance/import-modeling-data-reduction

データセットへのクエリ言語は DAX または MDX を使用します。MDX の場合は、データセット内で DAX に変換されるので、実質的には DAX が使われています。
|クエリ言語|正式名|説明|
|:-:|:-:|:-|
|DAX|Data Analysis Expressions|Analysis Services、Power BI、および Excel の Power Pivot で使用される数式表現言語です。 DAX の数式には、表形式データ モデルの関連テーブルと列のデータで高度な計算やクエリを実行するための関数、演算子、値が含まれます。|
|MDX|MultiDimensional eXpressions|多次元データベース用のクエリ言語。SAP BW や Oracle Essbase などでも使用されています。図では割愛しましたが、Excel ピボットテーブルは MDX でクエリします。|

# データフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668909/382d8caf-0d48-8175-bab0-70ba7f8cf560.png)
Power BI のデータセット作成をユーザーに開放する場合、データソースへの接続情報 (接続先情報と資格情報) が必要になります。部門管理のファイルなどを使用する場合は良いのですが、データベースへの接続情報を広く公開することは避けたいという要件はよくあることです。逆にデータベースを整備するのは時間がかかるから、とりあえず分析に使いそうなデータを加工して、ユーザーに公開したいといった要件もあるでしょう。そういった場合、情シス部門などでデータセットを用意するという方法の他に、**情シス側ではデータフローを作っておいて、ユーザーにはデータフローからデータセットを作ってもらう** という方法を取ることもできます。データフローは、データソースからデータを取得して必要に応じて加工されたテーブルとして Power BI 内部の Azure Data Lake Storage Gen2 に保存されます。ユーザーは必要なデータフロー (≒テーブル) を組み合わせてデータセットを作成できます。元データがどこにあるのか、ネットワーク構成、データソースに対する認証などを意識する必要はありません。また、正しく加工されたデータフローを用意しておくことで、正確性の担保されないデータの氾濫を抑制できます。
データフローについてはこちらの記事がおすすめです。

https://qiita.com/akihiro_suto/items/2bb906ea3aaf83ea607b

:::note warn
データフローからレポートは作成できないため、必ず Power BI Desktop でデータセットを作成する必要があります。データフローに DirectQuery で接続するデータセットを作成するには、Power BI Premium が必要です。インポートで接続する場合は、データフローの更新を行っても、そのデータフローを元にしたデータセットの中身は変わらないため、Power Automate を使用して、データフローの更新に続いてデータセットが更新されるよう設定することをお勧めします。
:::
https://qiita.com/ishiayaya/items/4d4a535ac1feb2acb23a

# データマート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2668909/69e1b8d2-c470-c12f-7be6-668aa5e44f1b.png)
データマートは Power BI Premium でのみ使用できる機能であるため、使ったことのない人が多いかもしれません。データフローと同様に Power BI サービス上で Power Query Online を使用します。データフローとの違いは、Power Query Online でデータを取得・加工した後、**リレーションシップやメジャーなどもブラウザーで作成できる**点、**データセットが自動生成される** 点、データストアとして Azure SQL Database が使われており **SQL クエリが可能** な点です。Power BI 以外からも使用する可能性がある場合、 [データフローのストレージを**組織の** Azure Data Lake Storage Gen2 に設定](https://learn.microsoft.com/ja-jp/power-bi/transform-model/dataflows/dataflows-azure-data-lake-storage-integration) して利用するよりも、扱いやすいのではないかと思います。
図では割愛しましたが、自動生成されるデータセットの他に、自分でデータセットを作成することもできます。

:::note
データフローも Premium なら Azure SQL Database にストアされるのですが、少なくとも現時点では SQL クエリができません。
:::

**リレーションシップやメジャーなどもブラウザーで作成できる** のはデータセットのロードマップ (まずはデータセットの編集を Power BI サービスでできるようにし、将来的には作成も Power BI サービスでできるようにするものと思われる) とも繋がっているのかな、と思っています。

https://learn.microsoft.com/en-us/power-platform-release-plan/2022wave2/power-bi/dataset-authoring-power-bi-service

:::note
ロードマップのドキュメント ↑ は、英語の方が最新なので、あえて英語のページのリンクを付けています。日本語で読みたい場合は、ブラウザの機能 (Microsoft Edge なら右クリック メニューで翻訳可能) などを使って翻訳してください。URLの「en-us」部分を「ja-jp」に書き換えると日本語版になりますが、内容が古い可能性があります。
:::
「データマート」の登場により、データ活用のためのデータの持ち方に新しい風を吹き込むことになると思います。GA (Generally Available：正式リリース) に向けてこれからも機能強化されていくと思いますので、ぜひお試しください。