Power Apps から Azure Databricks に接続する

## はじめに
2025/6 発表された Microsoft Power Platform から Azure Databricks に接続する機能について検証してみました。
ここではPower Apps から Databricks への接続を試しています。
（2025/6/18 時点ではパブリックプレビュー段階）

https://learn.microsoft.com/ja-jp/azure/databricks/integrations/msft-power-platform

## 前提条件
以下の要件を満たす必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/b2891644-f07a-4482-b311-ab7d9ac2af02.png)

また、テーブルに対して作成、更新、および削除を実行するには主キー設定が必要となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/31c91c00-c1a4-4671-b0dc-4b67739ae362.png)


## Databricks での作業

### テーブルの作成
Databricks にて Power Apps から接続するためのテーブルを用意します。
ここでは「顧客名」を主キーに設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/b864e952-dd60-4414-9c11-556b68406bc6.png)

＜サンプルコード＞
```python:create_table
# Create a table with primary key constraint
spark.sql("""
CREATE OR REPLACE TABLE {catalog}.{schema}.table_01 (
    `顧客名` STRING NOT NULL,
    `注文日` DATE,
    `合計金額` INT,
    PRIMARY KEY (`顧客名`)
)
""")

# Insert data into the table
spark.sql("""
INSERT INTO {catalog}.{schema}.table_01 (`顧客名`,`注文日`, `合計金額`) VALUES
('高橋次郎', to_date('2023-01-03', 'yyyy-MM-dd'), 2500),
('山田太郎', to_date('2023-01-04', 'yyyy-MM-dd'), 1000),
('田中三郎', to_date('2023-01-05', 'yyyy-MM-dd'), 3000)
""")
```

### SQL ウェアハウスの作成
ここではサーバーレスで作成しています。
後述の接続設定で使用するため、サーバーのホスト名と HTTP パスを控えておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/938df0b4-7c72-4546-87ab-1f615fa7bdc4.png)


## Power Apps での作業
### コネクタの設定
「作成」から「空のキャンバスで開始」を選択してキャンバスアプリを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/c07df68a-b467-4aac-9e65-4bea3a2a74f3.png)

「データの追加」から Azure Databricks コネクタを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/e02257ba-74d6-462c-9038-395124285c39.png)

認証方法を選択します。ここでは OAuth を選択しています。
また、先ほど控えておいたサーバーのホスト名と HTTP パスを入力します。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/4b4beb95-42bd-4b18-b903-de18cd3d723d.png">

接続が成功するとテーブルの一覧が表示されるので、アプリでソースとしたいテーブルを選択します。ここでは前述で作成したテーブルを選択しています。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/4690e80f-6eb2-4940-bde0-977bb0edfbfb.png">

### テーブルの表示
「挿入」から「レイアウト」の「データテーブル」を選択して、データソースに Databricks のテーブルを選択すると以下のように表示されます。
Databricks 上のデータと同じことが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/e7d4ea8f-3c0e-4736-9f43-dd251a73fc43.png)

### データの追加・更新・削除
「テキスト入力」「日付の選択」「リストボックス」を用いて追加・更新・削除したいレコードを定義し、「ボタン」で実行するように作成してみました。

<details><summary>Insert ボタンのアクションに設定した関数</summary>

```:OnSelect
Collect('<データソース>',{顧客名:InsertCustomer.Text,合計金額:Value(InsertTotalAmount.Text),注文日:InsertDate.SelectedDate});
```

</details>

<details><summary>Update ボタンのアクションに設定した関数</summary>

```:OnSelect
Patch('<データソース>', LookUp('<データソース>', 顧客名=UpdateCustomer.SelectedText.Value), {顧客名:UpdateCustomer.SelectedText.Value,合計金額:Value(UpdateTotalAmount.Text),注文日:UpdateDate.SelectedDate});
```

</details>

<details><summary>Delete ボタンのアクションに設定した関数</summary>

```:OnSelect
Remove('データソース', LookUp('データソース', 顧客名=DeleteCustomer.SelectedText.Value));
```

</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/c2c1aefa-6312-4099-836c-d070721e1f48.png)

プレビューでそれぞれの実行結果を確認します。

* Insert 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/590d0736-d70d-459b-bca2-2471696b12f9.png)

* Update 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/822ee318-6601-4776-9a9e-0a49bf569f50.png)

* Delete 結果
（レコードが削除されたためテーブルにもドロップダウンにも表示されない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/d5102193-d99f-4310-85bd-0fbfaa5d157b.png)

 また、Databricks 上から確認しても同様に反映されています。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/76975fa8-eb3e-4b9a-beb6-627855dc19e1.png)

## おわりに
実行時間は数秒であったので、リアルタイムに処理ができそうです。