DatabricksのDelta Live TablesでS3のデータを処理

## 前提
・利用環境：Databricks、AWS
・参考アーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/b7e4e456-49e2-4fd2-88b3-6bdda101ac61.png)

https://www.databricks.com/jp/try-databricks?scid=7018Y000001Fi15QAC&utm_medium=paid+search&utm_source=google&utm_campaign=17377047998&utm_adgroup=138148229998&utm_content=trial&utm_offer=try-databricks&utm_ad=732035937815&utm_term=databricks%20%E3%83%88%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%AB&gad_source=1&gclid=CjwKCAiA8Lu9BhA8EiwAag16b8b3zbkIb3V7gp-8VUwKukXnhtVZRQ-1RY8SbETmGVgNT4bQramYmRoCX5wQAvD_BwE#account

https://aws.amazon.com/jp/free/?gclid=CjwKCAiA8Lu9BhA8EiwAag16bz9ymovIOJzlwFFMfg75NQxxY8FJPB4Hslg7RheD7ipZ5gbvOWCd1RoCyP0QAvD_BwE&trk=8a8e7906-914d-4577-93a2-d09e75ae5941&sc_channel=ps&ef_id=CjwKCAiA8Lu9BhA8EiwAag16bz9ymovIOJzlwFFMfg75NQxxY8FJPB4Hslg7RheD7ipZ5gbvOWCd1RoCyP0QAvD_BwE:G:s&s_kwcid=AL!4422!3!487544183224!e!!g!!aws%20%E7%84%A1%E6%96%99%E5%88%A9%E7%94%A8%E6%9E%A0!11772965715!117413644991&all-free-tier.sort-by=item.additionalFields.SortRank&all-free-tier.sort-order=asc&awsf.Free%20Tier%20Types=*all&awsf.Free%20Tier%20Categories=*all

## 参考ドキュメント & Blog
https://qiita.com/taka_yayoi/items/3955b4bac96c4d6f604b

## 目次
1. Databricksで外部ボリュームを作成
1. Databricksのカタログを作成し、ストレージを設定
1. Notebookでメダリオンアーキテクチャ処理を作成
1. ETLパイプラインを作成
1. ワークフローを作成

## 手順
### 1.Databricksで外部ボリュームを作成
https://docs.databricks.com/aws/ja/connect/unity-catalog/cloud-storage/external-locations

https://www.youtube.com/watch?v=l0jo8s_xsDI

1)「カタログ」→「外部データ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/8f6f9462-d621-4fda-9f80-c589ef6b9c2e.png)
2)「外部ロケーションを作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/3222afea-e3ab-4c46-a6ad-c7355c6bd214.png)
3)「AWSクイックスタート」→「次のページ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/ef91b97e-5a9f-41b1-9919-2eb997b8ef85.png)
4)S3のパケット名を入力し、「新規トークンを生成」をクリック
例：
パケット名：s3://ho-iceberg（親パケット）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/aef4d57a-f461-46f7-bdff-0f962d30db77.png)
5)表示されるトークンをコピーし、「クイックスタートで開始」をクリック
6)遷移されたAWSのスタックのクイック作成画面のDatabricks Personal Access Token欄にコピーしたトークンを貼り付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/f2591554-87e6-4719-91d8-1b9d3c0d5a6d.png)
7)スタック名を適宜変更し、最後の以下をチェックし、「スタックの作成」をクリック
☑︎AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/1125f46c-a143-4b15-adb8-873b9df4c970.png)
8)Statusが「Create_Complete」になったら、Databricksの外部ロケーション一覧にも反映されてることを確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/14106475-c94e-4769-9056-4701f21a0b66.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/6e397025-edf2-4304-ab1b-41e89cfb21bb.png)
9)外部ロケーションの詳細画面に入り、「接続テスト」をクリックし、成功できるか確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/24093ec5-42fe-4e4d-8ae7-04a1dfd245c3.png)
10)「権限」→「付与」をクリックし、対象ユーザー、グループに必要な権限を付与
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/46e3c4fb-de6f-4a5c-9a4b-bde476643e60.png)
### 2.Databricksのカタログを作成し、ストレージを設定
https://youtu.be/ax9bZV40_is

1)「カタログ」→「＋」→「カタログを作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/f43cd0cd-6441-4e0f-9e31-a64d0c1c1be9.png)
2)上で作成した外部ロケーションを指定して、カタログを作成
例：
カタログ名：ho-cdc
タイプ：Standard
ストレージの場所：上で作成した外部ロケーション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/c6cc4e23-7481-4015-818f-bafe857e5ad4.png)
3)カタログを表示し、「詳細」タブからストレージルートと場所を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/446858c9-e717-4a79-9d3d-a0ffa1783544.png)
4)「スキーマを作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/578b1e0c-0ebd-4fdd-8eda-13e99f3d8c91.png)
5)スキーマ名とストレージの場所を指定し、「作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/5d9de8a9-50d6-401c-8e86-e5395f700ee8.png)
6)スキーマの詳細画面で、「作成」→「ボリュームを作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/9c56102a-a110-4bb1-a3b2-e68604130624.png)
7)下記を参考のS3の外部ボリュームを作成
例：
ボリューム名：raw
ボリュームタイプ：外部ボリューム
外部ロケーション：上で作成したもの
パス：s3://ho-iceberg/raw
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/ab24f6dd-6964-43cd-83c2-41b104555238.png)
8)AWSのrawパケットに入ってるファイルが同期されてることを確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/4b69ea37-59ef-4389-84d8-46ed30b34e6f.png)
### 3.NotebookでDLTを作成
1)「ワークスペース」→「作成」→「ノートブック」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/7b3c16f7-ffe3-4c02-a5fe-213713a3e3cc.png)
2)デフォルトの言語をSQLに変更し、メダリオンアーキテクチャ用のSQL文を作成
例：
-- Bronzeテーブルに生データを読み込む
`CREATE STREAMING TABLE customer_bronze
AS SELECT *
  FROM cloud_files(
    "/Volumes/ho-cdc/cdc/raw/sales/customer/",
    "parquet")`

-- Bronzeテーブルをクレンジングして、Silverテーブルを作成
`CREATE LIVE TABLE customer_silver(
  CONSTRAINT non_null_name EXPECT (name IS NOT NULL) ON VIOLATION DROP ROW
)
AS SELECT * FROM live.customer_bronze`

-- ユースケース別にGoldテーブルを作成
`CREATE LIVE TABLE customer_gold
AS SELECT * FROM live.customer_silver
WHERE name = 'John'`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/81cb1f8c-3d87-4084-a855-78d5355ecf57.png)
### 4.パイプラインを作成
1)「パイプライン」→「パイプラインを作成」→「ETLパイプライン」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/038e8ee3-3329-4c04-8d07-62ddc1f5abe3.png)
2)下記を参考に設定し、パイプラインを作成
例：
・パイプライン名：ho-pipe
・ソースコード：上で作成したノートブックを選択
・デフォルトカタログ：上で作成したカタログ
・デフォルトスキーマ：上で作成したスキーマ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/d41fd477-df8e-41ba-8116-cd6f08a87839.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/c06cb913-06e7-4e5d-b811-c191527d5e94.png)
3.「開始」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/7aa116dd-4f32-4a53-9189-7b51d8b518da.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/9112f4f3-d714-4bb5-8b62-a04a6b2aca72.png)
### 5.ワークフローを作成
1)「ワークフロー」→「ジョブを作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/5f33e421-6590-4a35-81c3-01ec851d69f2.png)
2)以下を参考にジョブを設定
例：
・タスク名：ice-job
・種類：パイプライン
・パイプライン：ho-pipe
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/b9262696-25e2-4b54-9e9f-3aff94f72ca7.png)
3)スケジュールとトリガーを追加
例：
・トリガーステータス：アクティブ
・トリガータイプ：ファイル到着
・ストレージ場所：外部ボリュームのファイルが追加される場所
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/ca79dbdc-a4a3-4de3-9bc7-850821df3c65.png)
4)「今すぐ実行」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/0be21105-4734-421b-834f-eafb6a8cae6d.png)
5)ファイルがS3に到着すると、ジョブが自動的に実行されることを確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/42505e5d-6ac8-4f0e-891a-9ba042c922e8.png)

以上