はじめに
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の橋渡し的な言い方をしていてリリース当初はあまり関心が湧いていませんでした。よく調べていくと運用面での自動化が出来る機能満載ですね!
公式ドキュメントはこちら
やりたいこと
- ワークスペース内の複数セマンティックモデル内のメジャーを一括更新したい
- セマンティックモデルは対象を絞る、もしくはすべてを対象とするかを選択したい
全体フロー
2つのノートブックを作成してData pipelineで更新するフローを作成しました
- ワークスペースを指定してセマンティックモデルIDとセマンティックモデル名を取得
- 対象のセマンティックモデル分だけループしてメジャー定義を更新
ノートブック
ワークスペースとモデル名の一部を指定してセマンティックモデルを取得する
通常の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
+新しい項目
から環境
を選択
ノートブックの環境で選択するとインラインでのインストールは不要になります。
以下、ノートブックでのセルの内容です
import sempy.fabric as fabric
workspace_name = "fabric_exercise"
model_name_prefix = "Contoso"
セマンティックモデル名のプレフィックスとワークスペース名をセットします。
このセルを parameter cell に設定します。これでData pipelineから渡されたパラメーターを上書きできるようになります。
# セマンティックモデルのリストを取得(ワークスペースの指定がない場合は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
ノートブックアクティビティの追加
パラメタの追加
キャンバスの空白部分を選択して、パラメタタブからワークスペース名とセマンティックモデル名のプレフィックスのパラメタを作成します。
ノートブックアクティビティにノートブックを選択しベースパラメーターを追加
- ノートブックを選択
-
+新規
からベースパラメタを追加 - 名前を入力
- 種類で
文字列
を選択 -
動的なコンテンツの追加[Alt+Shift+D]
を押下 -
パラメータ
を選択 -
OK
を押下
一旦、実行結果を確認する
次のアクティビティでのパラメタの設定を検討するために一旦実行して結果を確認します。
- ホームから
実行
を押下 - パラメータを設定
-
OK
を押下
アクティビティの結果からexitValueを取得するために、以下のような記載をします。
JSONの階層を.
で繋ぎます
activity('getSemanticModel_IDs').output.result.exitValue
ForEachアクティビティを追加
アクティビティを連結
成功時のチェックボックスの連結部をドラッグしてForEachのアクティビティにドラッグして連結します。
ForEachの項目を設定
動的なコンテンツの追加[Alt+Shift+D]
からアクティビティの結果をJSON形式で設定します
@json(activity('getSemanticModel_IDs').output.result.exitValue)
ForEachの中にノートブックアクティビティを追加
- ForEachの編集ボタンを押下
- アクティビティからNotebookを押下
- ノートブックを設定し、ベースパラメーターを追加します
- workspace_nameはパラメーターから設定
- dataset_nameには繰り返しのアイテムを設定
@item()[1]
の[1]はexitValueのリストの2番目の項目(セマンティックモデル名)を意味しています。
ノートブックアクティビティにセッションタグを追加
セッションタグを追加することでForEach内でで実行されるノートブックが同一セッション内で実行されます。
- ワークスペースの設定でPipelineの高コンカレンシーの設定を有効にします。
- ForEach内のノートブックの設定でセッションタグを設定します
任意の文字列でOKですが、今回はシステム変数のPipeline Nameを使用しています。
Data Pipelineの同時実行数を「1」に設定します
キャンバスの空白をクリックし、設定からコンカレンシー
を「1」に設定します。
この設定で誤って同時実行されることがなくなります。
完成!実行してみます・・・!
-
実行
をクリックし、パラメーターを設定して、OK
を押下します。 - 実行時にpipelineから渡したパラメーターで上書きされたことが確認できます
- print文の結果が確認できます
成功したので実行結果を確認してみます。
おわりに
- fabricのアイテムを活用して自動化の実装が可能になりました
- Pythonの実装には生成AI様様です😂
- Data pipelineではJSONと仲良くなることが重要だと思いました
勉強を続けていきます!