テクテク日記

テクテク=テクノロジー&一歩ずつ(テクテク)

Direct Lakeでフィール ドパラメーターを使う

2022年に登場したPower BI Desktopの最も優れた機能の1つに、フィールド パラメーター(以下「FP」)があります。以前、私はこの機能についていくつかの記事()で取り上げましたが、その使いやすさや効果から、多くの企業で現在も広く利用されているようです。最近では、顧客から「Direct LakeモードでFPを活用したいが、Power BI Desktopの「新しいパラメーター」がグレイアウトされており、これを実現することができない」という質問を受けました。

今回はこの事象及び解決策を紹介したいと思います。

※注意
「データセット」は別名「セマンティックモデル」に変更となっています。
Datasets renamed to semantic models | Microsoft Power BI Blog | Microsoft Power BI

追記: 今回のやり方よりも簡単にできる方法がGuy in a Cubeで紹介されましたので、興味ある方はこちらをご覧ください。

youtu.be

ライブ接続でFPは使用できない

以前、Direct Lakeをライブ接続で使用した場合、実際にはストレージモードがPower BI Desktopでは表示されないことを指摘しました。実は、Direct Lakeに限らず、インポートモードのセマンティックモデルでもFPを使用することはできないという制限事項があります。

このような制限があるなかで、インポートモードでFPを多用しており、将来的にDirect Lakeへのモデリング戦略を変更する顧客にとって、大きな障壁となる可能性があります。実際、Tabular Editorなどの外部ツールを使用すれば、ライブ接続(Direct Lakeモード)でもFPを構築することは可能です。ここでは具体的な解説に入る前に、少し背景を説明しておきます。

前提条件および留意点は以下の通りです。

  1. ライブ接続の場合、Power BI DesktopからFPを作成することはできない
  2. FPは計算テーブルとして扱われるため、ライブ接続でこれを可能にするためには、発行済みセマンティックモデルに変更を加える必要がある(後述しますが、重要な制限事項あり)
  3. Power BI Desktopからライブ接続の状態でFPを構築したい場合、ローカルモデルを追加して、DirectQueryモードに設定する必要がある
  4. ライブ接続はあくまでAnalysis Servicesセマンティックモデルに接続しており、そのモデル自体を変更することはできない
  5. FPは2023年12月時点で、まだパブリックプレビュー段階にある

上記のうち、FPの構築を可能にするには2と3の2つの方法がありますが、まずは簡単な3番目のやり方です。

ライブ接続からDirectQueryにしてFPを作る

  • 空のPower BI Desktopを立ち上げ、ホーム > Power BI データセット
  • 発行済セマンティックモデルを選択。ここではMyInvSalesを選択
  • 接続後、Power BI DesktopのモデリングからFPを作れないことを確認
  • もう一度、モデリング > このモデルに変更を加える > ローカル モデルの追加
  • 不要なテーブルがあれば外し、なければそのまま「送信」をクリック
  • Power BI Desktopのモデリング > 新しいパラメーター > フィールド
    DirectQueryモードに変更されたことを受け、FPを作れるようになりました。

これで作業は完了ですが、変更後のストレージモードがDirectQueryになっています。会社のモデリング戦略と一致しない場合は、この選択肢を避けるべきです。DirectQueryはデータ量が多くモデルが複雑な場合、レポートのクエリパフォーマンスに影響する可能性があるため、この選択を検討する際には注意が必要です。

XMLAエンドポイント経由でFPを構築

FP (Field Parameters)を使用するには、計算テーブルを作成する必要があります。ただし、ライブ接続では計算テーブルのサポートがされていないため、FPを作成することもできません。

すでに発行されたモデルは、Power BI DesktopでFP用の計算テーブルが作成されているため、これ自体には問題はありません。しかし、発行されたモデルをライブ接続で利用する場合、追加でFPをPower BI Desktopで作成しようとしても作成することはできません。従って、FPを追加したい場合、

オリジナルの発行済モデルに修正を加える

ことが必要となります。以下、前提条件となります。

  1. XMLAエンドポイントを有効にする
  2. セマンティックモデルに対するビルド権限を持っていることを確認
  3. プレミアム容量(PPU、PPC、Fabric容量)のワークスペースにセマンティックモデルがある(ライセンスモデル
  4. Tabular Editor 2 (無料)  or Tabular Editor 3 (有料)をインストール
  5. カスタムセマンティックモデルを使用する
  6. 互換性レベルが1604以上

TE2とTE3の違い

XLMAエンドポイント使用時の制限事項

実際に紹介する前に、下記2つの重要な制限事項を押さえておく必要があります。

  1. ブラウザから「データ モデルを開く」を使用できなくなります。この場合、Tabular Editorを介してモデルを編集することになります
  2. 当該セマンティックモデルをベースに作ったレポートは、ブラウザからpbixのダウンロードが不可*1になる。

どちらの制限も悩ましいものですが、将来的には緩和される可能性があります。現時点では、1番の対処法はTabular Editorへの開発環境の移行ですが、2番については以下の記事を参考にすることで、pbixファイルを復元することができます。このテクニックは元のpbixをバックアップする際にも有用ですので、参考にしてみることをお勧めします。

data-marc.com

Tabular EditorでFPを作る

制限事項を理解した上で、以下の手順でFPを作成していきます。ただし、本番環境のモデルを使用することはリスクが高いため、まずはダミーモデルを使ったほうが無難でしょう。

  • FabricでLakehouseを作ります
    Lakehouseの構築方法については、以前の記事()を参考にしてください。なお、FabricアイテムでなくてもPower BIのセマンティックモデル(データセット)であれば問題ありませんが、今回はDirect Lakeへのライブ接続に焦点を当てており、そのためにLakehouseに言及しています。
  • Lakehouseからカスタムセマンティックモデルを作る。セマンティックモデル(デフォルト)の場合、XMLAエンドポイントを使うことができません

    必要なテーブルを選択し、「確認」

    名前を変更し、リレーションシップを構築
  • DAXメジャーを記述

    OrderQuantity = SUM( Orders[Quantity] )
    OrderRevenue = SUM( Orders[Revenue] )
    # Orders = COUNTROWS( Orders )
  • ワークスペース接続」(サーバー名)をコピー
  • Tabular Editor 2を立ち上げ、Open Model from DB > 貼り付け
    なお、Tabular Editor 3はいくつかのバージョンに分かれており、Fabric容量にアクセスできるバージョンはチェックが必要です。

    Compatibility Level(互換性レベル)で1604になっていることを確認して、OK。
  • Direct Lakeモードを確認
  • 計算テーブルを作る
    Alt + 6で計算テーブルを作り、fpRegionCategoryという名前を入れます
  • 右側のExpression Editorに画像内の数式を入れ、Ctrl + Sで保存
  • fpRegionCategoryというテーブルから3つの列(Value1-Value3)が生成されますので、上から順番に列名を以下のように変更し、Ctrl + Sで保存

    Value○から変更された名前(「Name」「Field」「Sort」)はFPをPower BI Desktop内で使用した際の列名に該当します(Tabular Editor 2ではCtrl + Sを押さないと、Value○が見えてこないため、列名の変更ができません)。
  • Name InferredがFalseになっていることを確認(※Tabular Editor 3では先にName InferredをFalseに変更して初めて、名前の変更が可能)
    変更後の列名をクリックし、右側の設定画面でOptionsの中にあるName InferredがFalseになっていることを確認。
  • Nameをクリックし、Basicの中にあるSory By ColumnにてSortを選択
  • 計算テーブルをFPテーブルへ変換
    ここまでは通常の計算テーブルですが、ここから本来のFPテーブルへ変換する必要があります。
    Nameを選択 > Options > Group By Columns > Add > Field > OK の順に選択
  • Field列のメタデータ情報を入力
    Field > Metadata > Extended Properties > Add > Name (ParameterMetadata) > Valueを選択し、Valueには{"version":3,"kind":2}と入力します。

    重要なのは、Nameではなく、Field列NAMEOF関数使用列)に対するプロパティの設定となります。
  • スキーマ・テーブルを更新
    これまでの設定はすべてメタデータの情報を更新するものです。最後に、C#スクリプトを使用してテーブルスキーマを更新する必要があります。以下のソースコードをコピーし、C# Scriptウィンドウに貼り付け、▶ボタンをクリックした後、Ctrl + S(または上部の保存アイコンをクリック)で変更を発行済みのセマンティックモデルに反映させます。
    #r "Microsoft.AnalysisServices.Core.dll"
    using ToM = Microsoft.AnalysisServices.Tabular;

    var refreshType = ToM.RefreshType.Calculate;
    Model.Database.TOMDatabase.Model.RequestRefresh(refreshType)
    Model.Database.TOMDatabase.Model.SaveChanges();

    その際、下図のような表示が出ることがありますが、そのまま「はい」

    ※ Tabular Editor 3を使用している場合、右クリックベースでテーブルのメタデータを更新することができます。そのため、上記のC#スクリプトを使用せずに、モデルを更新することが可能です。
  • Power BI Desktopを立ち上げ、ライブ接続を行うため、「Power BI データセット」を選択

  • fpRegionCategoryからNameをキャンバスへドラッグ&ドロップ

    この状態で[# Orders]を下のほうのテーブルに持っていくと、以下のように、FPが機能しないように見えます

    そこで下のビジュアルを選択し、データを一回削除します。

    削除した後、もう一度fpRegionCategory[Name]をドラッグ&ドロップすると・・

    以下のように、今度はしっかりFPの切り口が出現しました。ここは混乱しやすく、見た目ではFPの構築が失敗したように見えますが、実際には表示方法を工夫する必要がある、注意が必要なポイントとなります。
  • 下のビジュアルに[# Orders]を入れ、上のビジュアルをスライサーに変更すると、本来のFPとなりました。

最後に

今回紹介した方法は一般的には広く受け入れられるものではありませんが、ライブ接続でFPを使用したい場合や、モデルのパフォーマンスを犠牲にしたくない場合に役立ちます。ただし、XMLAエンドポイントを使用することで、pbixファイルをダウンロードできなくなるだけでなく、ブラウザから「データ モデルを開く」こともできなくなりますので、そのようなトレードオフを受け入れることができる方には、ぜひ参考にしていただければと思います。

*1:理由はPower BI Desktopの「hardening」不足と呼ばれるものによるものです。つまり、Power BI Desktop自体でXMLAの変更を適切に処理し、ダウンロードできるようにするために必要な作業があるということです