[Microsoft Fabric] Lakehouseを中心としたエコシステム

# Lakehouseを中心としたエコシステム

Microsoft Fabricはデータに関するタスク全般をカバーするSaaS製品のため、全体像を理解すること、各手法のドキュメントにアクセスすること、いろいろ大変です。ということで‥まずはLakehouse周辺のエコシステムを図にまとめました😊

図の番号順にまとめています。参考になれば嬉しいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/4a45a424-3b3b-2712-da4b-24b1b89c7aac.png)

## ①ショートカットを構成する

Lakehouseを構成するファーストステップは、各種データソースからショートカットを構成してLakehouseからデータにアクセスできるようにすることです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/e08414fd-e819-e04d-0eb3-f28c5a4ddfdd.png)

https://learn.microsoft.com/ja-jp/fabric/onelake/onelake-shortcuts

## ②Notebookで、TablesやFilesにあるデータをSpark Dataframeに取り込む

```python
# CSVを読み込む
df = spark.read.format("csv").option("header","true").load("abfss_file_path")

# Dataframeを表示する
display(df)
```

TablesにあるデータはDelta形式のため、format("delta")とする。

```python
df = spark.read.format("delta").load("abfss_file_path")

# Dataframeを表示する
display(df)
```

abfssパスはファイルやテーブルを右クリックすると、コピーできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/5b62a2f9-2658-4cb7-9843-66bcf5b5d261.png)

format optionはcsv,parquet,jsonなどに対応。Headerをどうするかなどoptionも豊富。
以下ドキュメント参照

https://spark.apache.org/docs/3.2.0/sql-data-sources-csv.html

https://spark.apache.org/docs/3.2.0/sql-data-sources-parquet.html

## ③Spark DataframeをLakehouseのTablesに書き込む

```python
df.write.format("delta").mode("overwrite").saveAsTable("TableName")
```

書き込みモードは、`append`もあります。

TablesにDelta形式で書き込まれると、テーブルアイコンに▲マークがつきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/3f491fdf-8704-bd34-2445-5ef1dba2c9a3.png)

## ④Notebookで、TablesやFilesにあるデータをPandas Dataframeに取り込む

PandasのDataframeに読み込むためには若干コードが変わります。
`import pandas as pd`は必要です。

```python
import pandas as pd
df = pd.read_csv("abfss_file_path")

# Dataframeを表示する
display(df)
```

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html

LakehouseのFileにあるデータを右クリックして「データの読み込み → Pandas」で自動生成されるコードは以下です。（結果は同じ）

```python
# Lakehouseをマウント
mssparkutils.fs.mount("workspace_abfss_path", "/lakehouse/{Lakehouse_Name}")

import pandas as pd
df = pd.read_csv(mssparkutils.fs.getMountPath('/lakehouse/{Lakehouse_Name}/') + "file_path")

# Dataframeを表示する
display(df)
```

`mssparkutils` のドキュメントは以下。

https://learn.microsoft.com/ja-jp/fabric/data-engineering/microsoft-spark-utilities

## ⑤ Pandas DataframeとSpark Dataframeを相互に変換する

### PySpark → Pandas

pyspark.sql.DataFrame オブジェクトには toPandas() というメソッドがあるため、これを使えば変換できます。

 ```python
 pandas_df = spark_df.toPandas()
 ```

### Pandas → PySpark

SparkSession オブジェクトには createDataFrame というメソッドがあるため、これを使うと pandas.DataFrame を pyspark.sql.DataFrame に変換できます。

```python
import pandas as pd
spark_df = spark.createDataFrame(pandas_df)
```

https://zenn.dev/aikige/articles/exchange-data-between-pyspark-and-pandas

## ⑥Lakehouseの SQL 分析エンドポイント

Lakehouseでテーブルを作成すると、SQLエンドポイントも一緒に作成されます。
ブラウザやSSMSを利用してSQLタスクをこなすことが可能です。

> SQL 分析エンドポイントは、レイクハウスのデルタ テーブルに対して読み取り専用モードで動作します。 SQL 分析エンドポイントを使用してデルタ テーブルからデータの読み取りのみを行えます。 関数、ビューを保存し、SQL オブジェクト レベルのセキュリティを設定できます。

https://learn.microsoft.com/ja-jp/fabric/data-engineering/lakehouse-sql-analytics-endpoint

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/8059545f-c38a-0d37-6ac8-4ae7a415f84e.png)

## ⑦Power BI Sematic Model (Import Mode)のOneLake統合

Importモードで作成されたPower BI Semantic Model （以前はデータセットと呼ばれていました）から、OneLakeにデータをエクスポートできます。ドキュメントだけだと手順がわかりにくいため、テクテク日記も参照すると〇です。

https://learn.microsoft.com/ja-jp/power-bi/enterprise/onelake-integration-overview

https://marshal115.hatenablog.com/entry/2024/02/13/161528

![Diagram of OneLake integration for semantic models.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/47d28462-4a0b-7799-e972-1047badfdfd8.png)

## ⑧Direct Lake Mode

Import Mode、Direct Query Modeに加えて、第３のデータアクセス方法として、**Direct Lake** が利用可能になりました。Import Modeは早いけど、コピーが発生します。Direct Query Modeはリアルタイムだけど低速。Direct Lakeはコピーが発生せず、リアルタイムで、かつ高速です。

Direct Lake 用のSemantic Modelの作成方法は以下ドキュメント参照。

https://learn.microsoft.com/ja-jp/power-bi/enterprise/directlake-create-lakehouse#create-a-basic-direct-lake-model-for-your-lakehouse

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/0b88723f-893d-0f37-10cc-e185889df9fc.png)

## ⑨Semantic Link

**Semantic Link** を使うとDatascienceを行いデータをエンリッチする際に、Power BI Semantic Model内のデータを利用できます。

https://learn.microsoft.com/ja-jp/fabric/data-science/semantic-link-overview

具体的な手順は以下ドキュメントを参照。

https://learn.microsoft.com/ja-jp/fabric/data-science/read-write-power-bi

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/c20dda55-2e30-76b8-f071-73e562eeca26.png)

![A diagram that shows data flow from connectors to semantic models.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/129f9b49-c306-7412-e110-a7653bd98ef2.png)

# (AI生成) **Pandas**と**PySpark**の**DataFrame**の違い

1. **Pandas**:
    - **Python**のオープンソースライブラリで、構造化された表形式のデータを扱うために広く使用されています
    - データ分析、機械学習、データサイエンスプロジェクトで頻繁に利用されます
    - CSV、JSON、SQLなどのフォーマットからデータをロードし、行と列を含む**データフレーム**を作成します
    - 分散処理をサポートしていないため、大規模なデータセットに対応する際にはリソースを追加する必要があります
    - データフレームは可変であり、遅延評価されず、統計関数はデフォルトで各列に適用されます

2. **PySpark**:
    - **Pandas**がシングルマシンで動作するのに対して、**PySpark**は複数台のマシンで処理を実行します
    - 大規模なデータセットを扱う機械学習アプリケーションに適しており、**100倍**以上高速に処理できます
    - **Apache Spark**の機能を利用してPythonで記述されたライブラリであり、分散クラスターまたはシングルノードで並列に実行できます
    - 大規模かつパワフルな分散データ処理、機械学習アプリケーションのための分析処理エンジンです

簡潔に言えば、**Pandas**はシングルマシンで、**PySpark**は複数台のマシンで動作します。大規模なデータセットを扱う場合は**PySpark**が最適です

# まとめ

OneLakeのキャッチコピーの一つとして、One Copyがあります。様々なデータ関連のタスクをデータコピーを行うことなく実行できるというものです。が、One Copyを体現するためにはMicrosoft Fabric全体の設計と、それぞれのタスク別に考えられている機能を把握する必要があります。図をまとめることで私も理解が深まりました。

引き続き勉強頑張りましょう🤣![エクスペリエンスを探索 という言葉が表示されているタブレット画面。.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80467/44b2a1d7-79d7-35fc-dc0d-114da3db1e2c.jpeg)