Microsoft Fabric Semantic link で Power BI 利用状況レポートのデータを定期保存する - ビジュアルデータ -

## はじめに

[Microsoft Fabric Semantic link で Power BI 利用状況レポートのデータを定期保存する - 生データ -](https://qiita.com/ryoma-nagata/items/8462b59335e558af4ca4) の続きです。

生データを取得することが出来た一方、レポートに表示されているデータを取得する程度のほうが使いやすいというニーズもあるかもしれないので、DAXの結果を取得する方法を記載します。


## 準備 - 対象 DAX 調査

利用状況レポートはそのままではダウンロードできないので git 統合を利用して Power BI Desktop で開けるファイル形式にしてしまいます。

1. 利用状況レポートを有効化したら、git統合が有効になったワークスペースにレポートのコピーを保存します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/75dadb0b-fbb3-eb30-19e5-2a777aaf058b.png)

1. ソース管理からコミットします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/cf6409f4-6659-61d8-0508-c7c830b0cc84.png)

1. Azure Repos でこのように確認可能となります。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/3b380c15-2922-4ebc-3d72-ce830c4b50ff.png)


1. クローンしてPower BI Desktop で pbir ファイルを開けたら、パフォーマンスアナライザーを使用します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e1df2667-0b8f-7872-c573-745d29d1f7cd.png)
1. 対象のビジュアルで実行されているDAXクエリをコピーします。これを使用してデータを取得、保存していきます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/92f39a71-ea98-71c9-88fa-21b30a7c17d2.png)


## 手順

[Evaluate DAX](https://qiita.com/ryoma-nagata/items/dabd28b2615b460df9de#evaluate_dax)を使用していきます。
workspace の引数があるので、別のワークスペースのセマンティックモデルに接続も可能です。
※xmlaエンドポイントが有効である必要があるので PPU or Fabric のワークスペースが対象となります。

1. Report open requests の場合は以下のようになりました。
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/429e9fe9-a8d9-1846-057c-89de24bbdb08.png)
    
    ```python:pyspark
    # Report open requests
    dax= """
    // DAX Query
    DEFINE
    	VAR __DS0FilterTable = 
    		TREATAS({FALSE,
    			BLANK()}, 'Workspace reports'[IsUsageMetricsReportWS])
    
    	VAR __DS0FilterTable2 = 
    		TREATAS({FALSE,
    			BLANK()}, 'Reports'[IsUsageMetricsReport])
    
    	VAR __DS0FilterTable3 = 
    		FILTER(
    			KEEPFILTERS(VALUES('Reports'[ReportGuid])),
    			'Reports'[ReportGuid] = "7f5701b1-8771-453b-8602-587b5933ed15"
    		)
    
    	VAR __DS0Core = 
    		SUMMARIZECOLUMNS(
    			'Dates'[Date],
    			__DS0FilterTable,
    			__DS0FilterTable2,
    			__DS0FilterTable3,
    			"Weekly_Views", 'Model measures'[Weekly Views],
    			"Report_views", 'Model measures'[Report views]
    		)
    
    	VAR __DS0PrimaryShowAll = 
    		ADDMISSINGITEMS(
    			'Dates'[Date],
    			__DS0Core,
    			'Dates'[Date],
    			__DS0FilterTable,
    			__DS0FilterTable2,
    			__DS0FilterTable3
    		)
    
    	VAR __DS0BodyLimited = 
    		SAMPLE(3502, __DS0PrimaryShowAll, 'Dates'[Date], 1)
    
    EVALUATE
    	__DS0BodyLimited
    
    ORDER BY
    	'Dates'[Date]
    
    """
    
    df_report_open_requests = fabric.evaluate_dax(
        "Usage Metrics Report",
        dax,
        workspace='<対象のワークスペースID>'
    )
    display(df_report_open_requests)
    
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/f1c53df8-686a-74b0-94fb-294b63b44dea.png)
1. 取得できたデータを保存します。(パーティション上書きが便利なのでspark で処理していますが、evaluate_daxはpandas データフレームで返答するのでpythonで保存してもいいと思います

    ``` python:pyspark
    
    sdf_report_open_requests = spark.createDataFrame(df_report_open_requests)
    
    # 動的パーティション上書きを設定して、読みこんだデータフレームに存在するパーティションのみ差し替え
    spark.conf.set('spark.sql.sources.partitionOverwriteMode','dynamic')
    
    # 列名を補正
    sdf_report_open_requests = sdf_report_open_requests\
        .withColumnRenamed("Dates[Date]","Date")\
        .withColumnRenamed("[Weekly_Views]","Weekly_Views")\
        .withColumnRenamed("[Report_views]","Report_views")
    sdf_report_open_requests.write.partitionBy("Date").mode("overwrite").saveAsTable("report_open_requests")
    
    ```

以上のように、利用状況レポートの DAX を確認して、semantic link を使用することでビジュアルデータのレイクハウスへの保存が可能です。