テクテク日記

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

セマンティックモデルのOneLake統合

既に公式ドキュメントに記載されている方法はありますが、その説明がやや分かりにくいため、よりわかりやすく説明してみました。ただし、注意点や留意点については公式ドキュメントで十分に記載されているため、ここでは主にコンセプトと実現方法に焦点を当てて説明していきます。今回の記事の対象者ですが、Fabric LakehouseでPower BI Direct Lakeを使いたい人向けとなります。

learn.microsoft.com

OneLakeとの統合

OneLakeとの統合は、「インポートモデルからのDelta Parquetへの書き込み」として捉えることができます。

これまでのPower BIは、独自の技術を使用してデータをインポートモードでメモリに圧縮し、保持していました。しかし、FabricでOneLake、すなわち「オープンフォーマット」を活用するという意味では、まだギャップが存在していました。

そのため、Power BIチームはDelta Parquet形式としてインポートモデルのデータをOneLakeに書き込めるようにし、それらのデータをショートカットで再利用できるようにしました。以下はこの概念を図示したものです。

Power BIのセマンティックモデルは、もともと独自のストレージ書式であり、OneLakeで再利用することができませんでした。そこで、このセマンティックモデルを再利用できるようにするために、Delta Parquet形式に書き込みを行えるよう、「セマンティックモデルのOneLake統合」が導入されました。これにより、OneLakeの他のワークロードからセマンティックモデルをショートカットとして利用できるようになり、下図がその概念となります。

この新機能は顧客にとって非常に魅力的です。具体的な利点として以下のようなものが挙げられます:

  1. Fabricとのインテグレーションが可能になることで、シームレスなデータ統合を実現
  2. Fabricの分析エンジンを完全に活用できるため、より高度な分析や処理が可能
  3. SQLクエリ等でテーブルを作成する必要がなく、顧客は直接Direct Lakeを使用できるため、作業の手間が省ける

実際のユースケースとして、例えばセマンティックモデル内にあるDimProduct(全ての項目を含む商品マスタ)を再利用したい場合(一から作りたくない場合)等が考えられるでしょう。

前提条件

前提条件として、以下2つを満たす必要があります。

  1. Power BI Premium または Fabric のキャパシティ上のワークスペース内にある 1 つ以上のインポート セマンティック モデル
  2. モデルに対して有効になっている大規模セマンティック モデルの保存形式

その上で、「ユーザーはOneLakeにセマンティック モデル テーブルを保存できる」を有効化します。

という条件を満たしている必要があります。有効化が必要な項目がいくつかありますので、公式ドキュメントで確認しておきます。

やり方

公式ドキュメントは構築プロセスを省いているので、少し嚙み砕いてみていきます。ステップとしては非常にシンプルで、以下のステップに従います。特に3の部分の多くが省略されているため、ここではそのやり方を見ていきます。

  1. 前述の前提条件を全てクリアする
  2. 対象となるセマンティックモデルを確認
  3. SSMSで当該セマンティックモデルにアクセスし、TMSLコマンドを実行
  4. ショートカットで出力されたDelta Parquetテーブルにアクセス

1は飛ばして、2のプロセスですが、まずはインポートモードで作ったpbixをFabricポータルのワークスペースへアップロードします。この手法でなくとも、Power BI Desktopから発行したものでもOKですが、更新できるセマンティックモデルであることが重要です。

成功すると、下図のように、3つのアイテムがワークスペースで表示されるようになります(アップロード機能を使用すると、ダッシュボードまで付随してきます)。

ここから、以下2つを設定します。

A) セマンティックモデルの・・・をクリックし、「設定」> 「大きなセマンティックモデルのストレージ形式」を✅

続いて、下記「OneLake統合」もオンにしておきます。

B) 発行済みのワークスペース(Premium or Fabric容量)より、「ワークスペースの設定」> 「ワークスペースの接続」をコピー

ここからSSMSを立ち上げます。SSMS(SQL Server Management Studio)は、Microsoft SQL Serverのデータベース管理や開発を行うための統合開発環境IDE)であり、SQL Serverのデータベース管理者や開発者にとって、効率的で使いやすいツールとなります。Power BIを使う人はSSMSをインストールしておくと、データベース関連のデータソース(サンプルデータ)を扱うことができるようになります。

① Analysis Servicesを選択

② コピーした「ワークスペース接続」を貼り付ける

③ Azure Active Directory - Universal with MFAを選択

④ 認証用アカウント名を入力

最後にConnectをクリックし、認証用の画面が出現すると思いますので、そのまま続けていきます。成功すると、以下のような画面が出現します。

ここで公式ドキュメントに記載されたTMSLコマンドを実行します。TMSLは Tabular Model Scripting Languageの略で、全てのTabular Modelで実行されるタスクを自動化してスクリプト化できます。TMSLを使用すると、Tabularモデル(セマンティックモデル)のオブジェクトを作成、変更、バックアップ、削除、更新できます。最終的に、TMSLスクリプトJSON形式になり、セマンティックモデルのエンドポイントにプッシュする必要があります。

ここで一旦別のワークスペースへ戻り、Lakehouseを1つ作ります。既にLakehouseがある場合にはそれをそのまま使ってもOKです。
ワークスペースに対するアクセス権限を有している前提となります

LakehouseのTableの横にある「・・・」をクリック > 「新しいショートカット」>「Microsoft OneLake」を選択

しかしまだ対象のセマンティックモデルはOneLakeへエクスポートされていないので、どこにも見当たりません。

ここでSSMSに戻り、XMLAクエリエディタを立ち上げます。

こちらのTMSLスクリプトを参考に、対象となるセマンティックモデルの名前に変更します。XMLAクエリエディタに貼り付けます。

<database name>という部分を対象となるセマンティックモデルの名前に変更し、Executeボタンをクリック(もしくはF5で実行)。

成功すれば上記のようなメッセージが出現しますが、上述の設定を行っていなかった場合にいろいろと失敗しやすいので注意が必要です。なお、上記スクリプトを実行する前に、モデルの更新が必要という注意書きがありますが、アップロードしたpbixで更新をしなくても成功しています。念の為、更新を掛けておくとよいでしょう。

先程作成した"lh_SemanticModel"というLakehouseに戻り、同じ手順でOneLakeを参照すると、対象のセマンティックモデルがショートカットとして利用可能となったことを確認できます。

あとは、必要なDelta Parquetテーブルを順次選択していきます。

ショートカットを利用すれば、データの重複を回避しつつ、OneLake(Lakehouse)内のDelta Parquetテーブルを基に、必要なデータを取得して業務を進めることができます。

最後に、セマンティックモデルのOneLake統合の留意点を挙げておきます。

  1. OneLakeにエクスポートしたデータはOneLake課金の対象となる
  2. セマンティックモデルのテーブルをDelta Parquetデータにエクスポートするため、セマンティックモデルではなくなる(単なるDelta Parquetテーブルになってしまい、DAXメジャーやリレーションシップ等は消えてしまう)

活用場面によっては非常に便利な機能ですが、利用シーンをよく考えたほうが良い機能であると言えます。ちなみに、エクスポートした後でもセマンティックモデルはそのまま使用することができますし、データをそもそも更新する必要がないユースケース(例: サンプルデモ)であれば、セマンティックモデルを削除する選択肢もあるかもしれません。

追記: Bad News

本来、この機能はここで終わるはずでしたが、同僚のPat Mahoney氏から、この方法で作られたショートカットではそのままDirect Lakeを構築することができないことを知らされました。試しにやってみると、下図の通り、テーブルを選択することができないことが確認できます。

どうやらカラムマッピングモードがオンになっていることが原因Delta Column Mapping)であり、このままではPower BI用に活用することが難しいことになります。製品側によると、これはSQLメタデータ同期がカラムマッピングをサポートしていないためであり、現在その対応に取り組んでおり、3月末頃には改善される予定とのこと。

ただし、Patから共有された以下のPysparkコードを使用すれば、ショートカットテーブルに対してカラムマッピングを施さずに、新たにLakehouseにテーブルを書き込むことが可能です。したがって、これは暫定的なワークアラウンドとして使用できるかもしれません。

  • ショートカットテーブルを実際のDelta Parquetへ書き換え(カラムマッピングOFF)
# DeltaShortcutTestというデータベース内のテーブルのリストを取得する
tablenames = spark.catalog.listTables("lh_SemanticModel")

# テーブルごとに処理を行うループ
for tablename in tablenames:
    # Delta形式のテーブルを読み込む
    df2 = spark.read.format("delta").table(tablename.name)
    # カラムマッピングを施さずに、テーブルを指定した場所に上書き保存する
    # "Tables/" + tablename.name + "NoCM" の形式で保存先のパスを指定する
    df2.write.mode("overwrite").format("delta").save("Tables/" + tablename.name + "NoCM")

上記Pysparkを以下のように記述していきます。

  • lh_SemanticModel(Lakehouse)にショートカットテーブルがあることを確認
  • ノートブックを開く > 新しいノートブック
  • 左上のNotebook 1をクリックし、名前を変更する
  • Lakehousesを選択
  • 上記Pysparkコードをコードセルに入力(②)し、③Runをクリック
  • 更新完了後、「最新の情報に更新」をクリックすると新しいテーブルが追加されたことを確認可能
  • lh_SemanticModelに戻り、更新をするとハイライトのテーブルが出現していることを確認可能
  • 「新しい Power BIデータセット」をクリックすると、Delta Parquetテーブルを選択できるようになる

あくまでワークアラウンドとしてのやり方ですが、注意点もあります。

  • 新しく作られた末尾に「NoCM」のテーブルはショートカットではなく、OneLakeに新たに追加されたDelta Parquetデータであり、データの重複が発生している
  • 同じ名前にすることが出来なかったため、末尾に「NoCM」と付けている
  • 他にやり方があるかもしれないが、2024年2月13日点ではこのやり方に頼ることになる

最後に、「NoCM」を含むテーブルを削除したい場合は、以下のPysparkコードで対応できるので、記載しておきます。

  • NoCMを含むテーブルを削除
# "NoCM" を含むテーブルを取得する
matching_tables = [table.name for table in spark.catalog.listTables("lh_SemanticModel") if "NoCM" in table.name]

# テーブルごとに削除を行うループ
for table_name in matching_tables:
    # テーブルを削除する
    spark.sql("DROP TABLE IF EXISTS lh_SemanticModel." + table_name)