3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Microsoft FabricAdvent Calendar 2024

Day 14

【Fabric】Semantic-Link-Labsでメジャーの説明を一括更新

Last updated at Posted at 2024-12-13

はじめに

Microsoft Fabric Advent Calendar 2024の14日目の記事です。

Power BIでライブ接続ではメジャーのDAXが確認できなくなるので、Tabular Editorを使って説明欄にDAXを転記することで、ライブ接続でもレポート作成者がDAXを確認できるようにする手順を書いてみました。

FabricのSemnatic-Link-Labsを使えば、複数のセマンティックモデルに対して一括更新ができるんじゃんと思い、試したことを記事にしました。

ちなみにPythonは初心者(かつ習熟する気もない💦)なので生成AIと対話しながらのコードです。もしかすると非常識な書き方になっているかもしれません。

Semantic-Link-Labsとは?

ReadMeの翻訳です。

Semantic Link Labs は、Microsoft Fabric ノートブックで使用するために設計された Python ライブラリです。このライブラリは、Semantic Link の機能を拡張し、シームレスに統合して連携するための追加機能を提供します。Semantic Link Labs の目標は、技術的なプロセスを簡略化し、人々がより高いレベルの活動に集中できるようにし、人間の介入なしにマシンにより適したタスクを効率的に処理できるようにすることです。

Semantic Linkの拡張版ですが、Semantic Link自体がデータサイエンティストとBIの橋渡し的な言い方をしていてリリース当初はあまり関心が湧いていませんでした。よく調べていくと運用面での自動化が出来る機能満載ですね!

公式ドキュメントはこちら

やりたいこと

  • ワークスペース内の複数セマンティックモデル内のメジャーを一括更新したい
  • セマンティックモデルは対象を絞る、もしくはすべてを対象とするかを選択したい

全体フロー

image.png

2つのノートブックを作成してData pipelineで更新するフローを作成しました

  1. ワークスペースを指定してセマンティックモデルIDとセマンティックモデル名を取得
  2. 対象のセマンティックモデル分だけループしてメジャー定義を更新

ノートブック

ワークスペースとモデル名の一部を指定してセマンティックモデルを取得する

通常のPythonを使用するとPipeline実行時にノートブックから値が戻らなかった為、言語はPySpark(Python)を使用しました。
まだPreviewで制限事項にも以下の記載があるので、もう少し待つしかないかなと。

Currently, the data pipelines integration , scheduler and Copilot on Python notebook is not fully supported in several regions. The deployment process is still ongoing, please stay tuned as we continue to roll out support in more regions.

!pip install semantic-link-labs

data pipelineからの呼び出しでは %pipがエラーになるため、!pip を使用しています。本当は環境を作成して適用するのがよいです。
https://learn.microsoft.com/ja-jp/fabric/data-engineering/library-management#python-inline-installation

+新しい項目から環境を選択

image.png

こんな感じで設定して。
image.png

ノートブックの環境で選択するとインラインでのインストールは不要になります。
image.png

以下、ノートブックでのセルの内容です

import sempy.fabric as fabric
workspace_name = "fabric_exercise"
model_name_prefix = "Contoso"

セマンティックモデル名のプレフィックスとワークスペース名をセットします。
このセルを parameter cell に設定します。これでData pipelineから渡されたパラメーターを上書きできるようになります。
image.png

# セマンティックモデルのリストを取得(ワークスペースの指定がない場合はNotebookが保存されているワークスペースが範囲)
if workspace_name:
    df_datasets = fabric.list_datasets(workspace=workspace_name)
else:
    df_datasets = fabric.list_datasets()

# 先頭一致でセマンティックモデルをフィルタリング(指定がない場合は該当ワークスペース全体のセマンティックモデルが対象)
if model_name_prefix:
    filtered_df = df_datasets[df_datasets["Dataset Name"].str.startswith(model_name_prefix)]
else:
    filtered_df = df_datasets

# "Dataset ID"と"Dataset Name"のペアをリストに変換
filtered_dataset_info = filtered_df[["Dataset ID", "Dataset Name"]].values.tolist()

# データセットIDとデータセット名のペアをnotebook.exitで返す
notebookutils.notebook.exit(filtered_dataset_info)

最後のステップのnotebookutilsでパイプラインに値を返します。
※なんとなく汎用性を考えてIDと名称をとっています。

セマンティックモデル内のメジャーを一括更新

こちらは戻り値が不要だったので通常のPythonにしました。SparkよりCUが節約できますね。

!pip install semantic-link-labs

ノートブックに環境を割り当てていればインストール不要です

import sempy_labs as sl
import sempy_labs.tom as tom
workspace_name = 'fabric_exercise'
dataset_name = 'Contoso'

上のセルを parameter cell に設定します。

# モデルに接続し読み書き可能に設定
with tom.connect_semantic_model(dataset_name, readonly=False, workspace=workspace_name) as model:
    # メジャーの一覧を取得
    measures = model.all_measures()
    
    # メジャーの名前と定義を取得し、Descriptionにセットして更新
    for measure in measures:
        definition = measure.Expression
        model.update_measure(measure_name=measure.Name, description=definition)
        print(f"Updated Measure: {measure.Name}")
        print(f"  New Description: {definition}")

pipelineでの実行時のデバッグのために、print文を追加しています。

Data pipeline

Data pipelineを作成します
image.png

image.png

ノートブックアクティビティの追加

image.png

image.png

image.png

パラメタの追加

キャンバスの空白部分を選択して、パラメタタブからワークスペース名とセマンティックモデル名のプレフィックスのパラメタを作成します。

image.png

ノートブックアクティビティにノートブックを選択しベースパラメーターを追加

  1. ノートブックを選択
  2. +新規からベースパラメタを追加
  3. 名前を入力
  4. 種類で文字列を選択
  5. 動的なコンテンツの追加[Alt+Shift+D]を押下
  6. パラメータを選択
  7. OKを押下

image.png

image.png

一旦、実行結果を確認する

次のアクティビティでのパラメタの設定を検討するために一旦実行して結果を確認します。

  1. ホームから実行を押下
  2. パラメータを設定
  3. OKを押下

image.png

image.png

image.png

出力をクリックし出力結果のJSONを確認
image.png

結果は以下のようになります。
image.png

アクティビティの結果からexitValueを取得するために、以下のような記載をします。
JSONの階層を.で繋ぎます
activity('getSemanticModel_IDs').output.result.exitValue

ForEachアクティビティを追加

image.png

アクティビティを連結

成功時のチェックボックスの連結部をドラッグしてForEachのアクティビティにドラッグして連結します。
image.png

ForEachの項目を設定

動的なコンテンツの追加[Alt+Shift+D]からアクティビティの結果をJSON形式で設定します

@json(activity('getSemanticModel_IDs').output.result.exitValue)

image.png

ForEachの中にノートブックアクティビティを追加

  1. ForEachの編集ボタンを押下
  2. アクティビティからNotebookを押下
  3. ノートブックを設定し、ベースパラメーターを追加します
  4. workspace_nameはパラメーターから設定
  5. dataset_nameには繰り返しのアイテムを設定

@item()[1]の[1]はexitValueのリストの2番目の項目(セマンティックモデル名)を意味しています。

image.png

image.png

image.png

image.png

image.png

ノートブックアクティビティにセッションタグを追加

セッションタグを追加することでForEach内でで実行されるノートブックが同一セッション内で実行されます。

  1. ワークスペースの設定でPipelineの高コンカレンシーの設定を有効にします。
  2. ForEach内のノートブックの設定でセッションタグを設定します
    任意の文字列でOKですが、今回はシステム変数のPipeline Nameを使用しています。

image.png

image.png

image.png

Data Pipelineの同時実行数を「1」に設定します

キャンバスの空白をクリックし、設定からコンカレンシーを「1」に設定します。

この設定で誤って同時実行されることがなくなります。

image.png

完成!実行してみます・・・!

  1. 実行をクリックし、パラメーターを設定して、OKを押下します。
  2. 実行時にpipelineから渡したパラメーターで上書きされたことが確認できます
  3. print文の結果が確認できます

image.png

成功したので実行結果を確認してみます。

image.png

image.png

image.png

image.png

おわりに

  • fabricのアイテムを活用して自動化の実装が可能になりました
  • Pythonの実装には生成AI様様です😂
  • Data pipelineではJSONと仲良くなることが重要だと思いました

勉強を続けていきます!

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?