Databricksにおけるビジネスアナリストからデータエンジニアへの転換

年末年始でこの辺りの記事を読んでいました。

https://qiita.com/taka_yayoi/items/196d0b7eb9edcc86e35e

https://qiita.com/taka_yayoi/items/3b4cece1c4467bfce4db

一応、自分の専門はデータエンジニアなのですが、それに至るパスというのをあまり考えたことがありませんでした。キャリアパスという観点では、[一つ目の記事](https://qiita.com/taka_yayoi/items/196d0b7eb9edcc86e35e)が非常に示唆に富んでいたと思います。こちらの記事ではビジネスアナリスト(データアナリスト/BIエンジニア)からデータエンジニアにロール変更を行う際の実践的なステップが紹介されています。

そこで、こちらの記事でDatabricksを活用しているデータアナリストがデータエンジニアに転換するにはどういった取り組みが必要なのかをウォークスルーします。

# ビジネスアナリストとデータエンジニア

[こちらの記事](https://qiita.com/taka_yayoi/items/196d0b7eb9edcc86e35e#bi%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0-vs-%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0)でも触れられていますが、改めて書き出してみます。

![Screenshot 2025-01-08 at 9.27.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7c67d05d-a82c-faac-02cb-f1eb53d9fae9.png)

**ビジネスアナリスト**

- 分析データや機械学習モデルのアウトプットからビジネス示唆を抽出します。その際には、BIツール(可視化やダッシュボード、レポート)を駆使して、ステークホルダーとコミュニケーションします。
- つまり、分析対象データ自体は別のペルソナであるデータエンジニアに準備してもらうことがほとんどです。
- **関心事項:** 分析に求められる観点、利用可能な分析データやBIツール
- **データエンジニアとの関係:** 分析に必要なデータの種類、品質、更新頻度などに関する要望やフィードバックをデータエンジニアにインプットします。

**データエンジニア**

- データ分析に至るデータパイプラインを構築し、質の高いデータを提供します。
- データエンジニアはビジネスアナリストやデータサイエンティストの要請に基づいてデータパイプラインを設計、実装し、運用に責任を持ちます。
- **関心事項:** データの種類、品質、更新頻度、データ処理に対する要件、データパイプラインの安定稼働
- **ビジネスアナリストとの関係:** ビジネスアナリストが分析に必要とするデータの種類、品質、更新頻度を満足するデータパイプラインを設計、実装、運用することで、彼らのニーズに応えます。

データサイエンティストは今回の文脈から外れるので割愛します。ビジネスアナリストとデータエンジニアとでは関心事項が異なり、連携することでビジネス提供価値を高めることができます。

![Screenshot 2025-01-08 at 9.52.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/191a6388-03a1-ac25-6e25-aae35e4b5590.png)

# DatabricksにおけるBI

Databricksネイティブで活用できるBI機能は[Databricks AI/BI](https://www.databricks.com/jp/product/ai-bi)です。PowerBIやTableauと連携することも可能ですが、ここではDatabricks AI/BIを活用したBIをウォークスルーします。マニュアルはこちらです。

https://learn.microsoft.com/ja-jp/azure/databricks/ai-bi/

DatabricksにおけるBIに関連する機能を以下の赤枠で示します。

![Screenshot 2025-01-08 at 12.47.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8c4c894a-af72-792e-8d3e-c23b301d7de4.png)


Databricks AI/BIはダッシュボードとGenieから構成されており、これら二つの機能は補完関係にあります。

- **ダッシュボード:** 生成AIを活用することでローコード、ノーコードでダッシュボードを作成することができます。データの概観を把握する助けとなります。
- **Genie:** データをベースとした生成AIとの会話を通じて、データへの理解を深めることができます。

このように、BIの文脈に生成AIを持ち込むことで、これまでにないBI体験を提供しているのがAI/BIとなります。AI/BI誕生の背景に関しては[こちら](https://qiita.com/taka_yayoi/items/3b4cece1c4467bfce4db)をご覧ください。

ここでは、Databricksワークスペースに最初から組み込まれている[サンプルデータ](https://learn.microsoft.com/ja-jp/azure/databricks/discover/databricks-datasets)を用いて、以下のステップでBIをウォークスルーします。

1. データの特定
1. (分析目的に基づいた)分析観点の検討
1. クエリーの作成
1. ダッシュボードの作成
1. ダッシュボードの公開

## データの特定

[こちら](https://learn.microsoft.com/ja-jp/azure/databricks/data-governance/unity-catalog/manage-privileges/privileges)で説明されているように、Databricksではテーブルやファイルは3レベルの名前空間`カタログ.スキーマ(データベース).テーブル`で管理されます。1つのカタログの中には複数のスキーマが存在し、1つのスキーマの中には複数のテーブルやモデル、ファイルが格納されます。

![](https://learn.microsoft.com/ja-jp/azure/databricks/_static/images/unity-catalog/object-hierarchy.png)

Databricksでデータ(テーブルやファイル)にアクセスする最も簡単な方法は、[カタログエクスプローラ](https://learn.microsoft.com/ja-jp/azure/databricks/catalog-explorer/)を用いることです。サイドメニューの**カタログ**をクリックすることで、カタログエクスプローラにアクセスすることができます。

![Screenshot 2025-01-08 at 10.38.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/05aa48f5-d256-c146-508b-63f3ba34d5ed.png)

ここでは、共有の下にある`samples`カタログ配下の`nytaxi`スキーマにある`trips`テーブルを使用します。これはニューヨークにおけるタクシーの乗降記録のデータです。

![Screenshot 2025-01-08 at 10.50.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4058743b-8532-a590-cb51-b317a46e4538.png)

BIであろうとデータエンジニアリングであろうと、カタログエクスプローラは頻繁にアクセスすることになりますので、[データの検出](https://learn.microsoft.com/ja-jp/azure/databricks/discover/)や[データベース オブジェクトを探索する](https://learn.microsoft.com/ja-jp/azure/databricks/discover/database-objects)を参考にしてカタログエクスプローラのUIに慣れておきましょう。

**サンプルデータ**タブをクリックすると、テーブルの中身を確認することができます。この時点で、データのイメージを掴むことができます。

![Screenshot 2025-01-08 at 10.55.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/eeab18a3-e2af-f12d-8e96-0731d486ba1b.png)

## (分析目的に基づいた)分析観点の検討

今回はウォークスルーなので、以下のような観点で分析を行います。もちろん、ご自身の想像力を発揮して好きな観点で分析しても構いません。

- 移動距離(`trip_distance`)と料金(`fare_amount`)の相関関係
- 乗車時刻(`tpep_pickup_datetime`)のトレンド

## クエリーの作成

上で定めた分析観点に基づいてデータを取得、集計するためのクエリーを作成します。クエリーを作成するためには、[SQLの基本的な知識](https://qiita.com/taka_yayoi/items/da227cec883c410de78e)が必要となります。データエンジニアリングにおいても、SQLは非常に多くの場面で活用することになりますので、データエンジニアに転換する際にはSQLの学習を進めることを強くお勧めします。BIの場合、`SELECT`文による参照系のクエリーがほとんどですが、データエンジニアリングでは`INSERT`、`UPDATE`、`DELETE`のような更新系クエリー、`CREATE TABLE`、`DROP TABLE`のような定義系クエリーを駆使することになります。

`trips`テーブルが表示されている状態で、画面右上の**作成 > クエリー**ボタンをクリックします。

![Screenshot 2025-01-08 at 10.59.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6fe90820-eca1-adc7-6d05-cd94b6dabb6e.png)

すると、[SQLエディタ](https://learn.microsoft.com/ja-jp/azure/databricks/sql/user/sql-editor/)に遷移します。ここで、SQLを用いたクエリーを作成、実行することができます。

![Screenshot 2025-01-08 at 11.01.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/28782962-1435-efc8-e52c-dfa722593778.png)

計算資源である**ウェアハウス**を選択し、エディタにSQLを記述し、実行ボタンを押すことで実行結果を表示させるという流れになります。表示されているSQLクエリー`SELECT * FROM trips`を実行することで、テーブルの中身が表示されます。　BI、データエンジニアリングの両方において、SQLエディタも頻繁に使用することになるので、[こちら](https://learn.microsoft.com/ja-jp/azure/databricks/sql/user/sql-editor/)を参考にUIに慣れ親しむようにしましょう。

![Screenshot 2025-01-08 at 11.08.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/827d4904-4297-22e0-e95f-f9478f0169e9.png)

分析観点に即したクエリーを実行し、その結果を可視化することでダッシュボードの部品(ウィジェット)を作成することができます。これらのウィジェットを組み合わせることでダッシュボードを作成することができます。

**移動距離(`trip_distance`)と料金(`fare_amount`)の相関関係**

この観点では、二つの列から散布図を作成することで可視化できます。**未加工の結果**の右にある **+ > 可視化**をクリックすることで可視化を行うことができます。可視化のダイアログが表示されます。

![Screenshot 2025-01-08 at 11.14.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6d712280-f2c6-378d-0fef-39c08229b89d.png)

以下の設定を行います。

- Visualization type: Scatter(散布図)
- X column: trip_distance
- Y columns: fare_amount

![Screenshot 2025-01-08 at 11.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8274e0e2-22be-21ea-93ea-4032df00e72f.png)

設定を行うとプレビューが表示されるので、いろいろな設定を試してみてください。満足できるものが得られたら、右下の保存をクリックします。

![Screenshot 2025-01-08 at 11.16.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/08e0d12b-1ac2-b19e-1fb8-9c81e0ac1b17.png)

**乗車時刻(`tpep_pickup_datetime`)のトレンド**

同じように、**+ > 可視化**をクリックして可視化を追加します。

以下の設定を行います。

- Visualization type: Bar(棒グラフ)
- X column: tpep_pickup_datetime、Daysで集計
- Y columns: `*`と`Count`を選択

このように設定することで、`tpep_pickup_datetime`の日毎の件数を集計して可視化することができます。同じように保存します。

![Screenshot 2025-01-08 at 11.19.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bef0b332-6712-9b34-2759-1ea62e09870e.png)

これで、ダッシュボードに必要なウィジェットが準備できました。

![Screenshot 2025-01-08 at 11.20.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/872292c2-8a52-fb4a-9956-f5dd11e8d299.png)

実際には、可視化の設定を試行錯誤したり、クエリーを編集して必要な洞察を導き出す営みを行うことになります。また、SQLエディタでは[Databricksアシスタント](https://learn.microsoft.com/ja-jp/azure/databricks/notebooks/use-databricks-assistant)を活用することもできます。

![Screenshot 2025-01-08 at 11.33.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/37e3ff9f-28a2-269b-a8d6-dfe29dff7f1d.png)
![Screenshot 2025-01-08 at 11.34.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/90c0005f-dd1d-558c-67cb-ad1381a05213.png)
![Screenshot 2025-01-08 at 11.37.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/86f01b8a-a473-2985-3a34-2d84408e6f5a.png)

## ダッシュボードの作成

可視化の部品のタブの右にある下向きの矢印をクリックして、コンテキストメニューを呼び出します。ここで、**ダッシュボードに追加**を選択します。

![Screenshot 2025-01-08 at 11.21.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3d6df8ef-a290-443b-6780-89f1526d2836.png)

すると、ダッシュボード作成のダイアログが表示されます。

以下の設定を行います。

- 新規ダッシュボードを作成
- 名前: `NYタクシー乗降データダッシュボード`など分かりやすい名前を指定
- ウィジェット: ダッシュボードに含めたいウィジェットにチェック

![Screenshot 2025-01-08 at 11.25.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7ddbd080-704a-dada-11ec-7e59cdcf2114.png)

**クエリーを保存して作成**をクリックします。

![Screenshot 2025-01-08 at 11.25.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ec21c079-a74f-7970-1ffe-37ddc24234b7.png)

上で作成したクエリーに名前をつけて、適切な場所に保存します。

![Screenshot 2025-01-08 at 11.26.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/55e68ee3-f57c-5402-e8df-d0b06bbf9d77.png)

すると、ダッシュボードの画面に遷移します。

![Screenshot 2025-01-08 at 11.26.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0f972248-e50b-7422-d556-c5316617d078.png)

配置されているウィジェットは、ドラッグ&ドロップで移動やサイズ変更ができるので、好きなように編集します。さまざまな設定が可能ですので、[こちら](https://learn.microsoft.com/ja-jp/azure/databricks/dashboards/)を参考にウォークスルーしてみてください。

![Screenshot 2025-01-08 at 11.29.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/05ab5326-679e-528a-525d-e2732f3b6cca.png)

また、ウィジェットの作成でもAIアシスタントの助けを借りることができます。(日本語を含む)自然言語でウィジェットの作成を指示することができます。

![Screenshot 2025-01-08 at 11.38.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fdfaaf2e-0733-e423-9a07-84bb76596afb.png)
![Screenshot 2025-01-08 at 11.38.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/aef1253d-6d49-2b20-f07e-23377c5be5ad.png)

また、この時点で**データ**タブにアクセスし、テーブルとして`trips`テーブルを追加しておきます。これを設定しておかないと、あとでGenieスペースが正常に動作しません。

![Screenshot 2025-01-08 at 12.25.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/522ec2a6-b696-23d2-800e-68ce43e483dc.png)

## ダッシュボードの公開

ここまでで作成したダッシュボードは**下書き**状態であり、あなた以外の方が参照することはできません。あなたが導き出した示唆を他のメンバーに共有するためにダッシュボードを公開しましょう。

ダッシュボード名の右にある**下書き**を展開し、**公開**を選択します。

![Screenshot 2025-01-08 at 11.40.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8c3bea48-75a5-1fee-a6fd-df65b94840e1.png)

ここで、公開設定のダイアログが表示されます。

- **資格情報を埋め込む**がデフォルトになっています。この場合、ダッシュボードの参照者は**あなたの資格情報を用いて**ダッシュボードにアクセスすることになります。**認証情報を埋め込まない**を選択することで、ダッシュボードの参照者は**参照者自身の資格情報を用いて**ダッシュボードにアクセスすることになります。セキュリティ要件に基づいて設定を行ってください。ここでは、デフォルトの**資格情報を埋め込む**のままにしておきます。
- アクセス許可のある人は、デフォルトはあなた自身と管理者のみです。次の画面で、アクセス可能なユーザーを指定することになります。
- **Genieを有効にしてください**のトグルをオンにすることで、このダッシュボードと連携するGenieのスペースを作成することができます。ここではオンにしておきます。デフォルトの**Auto-generate Genie space**(Ginieスペースを自動生成)を選択します。

![Screenshot 2025-01-08 at 11.45.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ece355f9-96c4-a23a-48c8-fc890cc68d0e.png)

設定が完了したら**公開**をクリックします。

必要に応じて、ダッシュボードにアクセスできる人を追加します。

![Screenshot 2025-01-08 at 11.47.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/89a8cbee-4ee8-39f3-1e62-a8c32d29f126.png)

上のダイアログを閉じると、公開状態のダッシュボードに遷移します。

![Screenshot 2025-01-08 at 11.48.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/990459cb-88c3-32fa-a739-b86c31b2e7b5.png)

これでダッシュボードが公開されましたので、ステークホルダーに示唆を共有しましょう！

## Genieの活用

ダッシュボードが公開されましたが、この可視化の結果からさらに深掘り分析を行いたいということはよくあることかと思います。その際に、一からクエリーを作成することも可能ですが、強力な相談相手になってくれるのが[Genie](https://learn.microsoft.com/ja-jp/azure/databricks/genie/)です。汎用型の生成AIとは異なり、**データ**という文脈を与えることで、あなたが取り扱っているデータに基づく質問を自然言語で行えるのがGenieの大きな特徴の一つです。

ダッシュボード左上に表示されている**Genieに聞く**をクリックします。

![Screenshot 2025-01-08 at 11.48.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/0753e973-8933-1a16-e416-4120942aabff.png)

Genieとの対話画面が右下に表示されます。

![Screenshot 2025-01-08 at 12.08.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fd4c7147-eaf8-da14-a479-b74e01f16039.png)

データに関する質問を行い、データに対する理解を深めましょう！

![Screenshot 2025-01-08 at 12.26.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/79eed018-cc46-6e70-4d6c-d0b92ba85fc1.png)
![Screenshot 2025-01-08 at 12.27.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3c391383-38a2-b9ac-db3a-1f7657ee343c.png)

ウィンドウの3点リーダーをクリックし、**Open Genie Space**をクリックすることで、スペースに移動してより詳細なやり取りを行うことも可能です。

![Screenshot 2025-01-08 at 12.27.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/772f6098-a535-e9f3-50e5-3d0f2398f95b.png)

![Screenshot 2025-01-08 at 12.29.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e9a47891-4303-5641-6d50-d68b1e7bce88.png)

## DatabricksにおけるBIの振り返り

- [カタログエクスプローラ](https://learn.microsoft.com/ja-jp/azure/databricks/catalog-explorer/)で分析データを特定しました。
- [クエリー](https://learn.microsoft.com/ja-jp/azure/databricks/query/)とウィジェットを作成しました。その際にはアシスタントのサポートを受けることができます。
- ウィジェットを組み合わせで[ダッシュボード](https://learn.microsoft.com/ja-jp/azure/databricks/dashboards/)を作成しました。
- ダッシュボードと[Genieスペース](https://learn.microsoft.com/ja-jp/azure/databricks/genie/)と連携させることで、鳥瞰と深掘りを行ったり来たりすることができました。

# ビジネスアナリストからデータエンジニアへの転換

冒頭で触れた[ロールの違い](#ビジネスアナリストとデータエンジニア)に基づいて、改めて違いを確認します。

- BIは分析データの特定がスタートであるが、データエンジニアリングは分析データの提供がゴールであり、そのゴールに到達するために**データソースを調査**することがスタート地点となります。
- BIでは基本的には参照系のクエリーしか使用しませんが、データエンジニアリングでは**テーブルの作成やデータの更新**が必要となります。
- データエンジニアリングでは、データソースから分析データに到達する**データパイプライン**の開発、運用が主要なタスクとなります。

結果として、以下のようなスキルの拡張や新規習得、マインドセットの転換が求められます。

![Screenshot 2025-01-08 at 14.55.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2624c6a6-f9e7-44c8-8250-bcf3d5a3957b.png)

| ビジネスアナリスト | データエンジニア |
|:--|:--|
| データモデリング  | データエンジニアでもデータモデリングは必要(転用)  |
| SQL| 基礎的なSQLから高度なSQLへ(拡張)  |
| ETLプロセスの経験  | BIツール上でもETLは行われていましたが、それをデータパイプラインとして実装することになります(拡張)  |
| 分析のマインドセット  | 分析のマインドセットを踏まえて、データエンジニアリングのマインドセットを持つ必要が出てきます(転換)。むしろ、分析のマインドセットを持っていることが強みになる(データ利用者の気持ちがわかる)と思います。  |
| -   | データパイプラインの実装においては、SQLだけでは達成できないユースケースも出てくるので、Python(PySpark)の知識が必要となります。  |
| -  |  Sparkなど高速にデータを処理できるデータパイプラインの理解、習熟が求められます。並列分散処理のコンセプトの理解、実践が求められます。 |
| -  |  パイプラインの開発とソフトウェア開発には共通する点が多くあります。SDLC(ソフトウェア開発ライフサイクル)に対する理解と実践が求められます。 |
| -  | データのみならず、機械学習モデルなどデータパイプラインに関連する資産が適切に管理されていることが重要となります。ガバナンスの理解と実践が重要となります。  |

# Databricksにおけるデータエンジニアリング

Databricksにおけるデータエンジニアリングに関連する機能を以下の赤枠で示します。[BIと比べて](#databricksにおけるbi)非常に多岐に渡っていることがわかるかと思います。

![Screenshot 2025-01-08 at 12.47.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/51599009-4742-4b96-a604-ed890947edf1.png)

ここでは、[Delta Live Tablesやストリーミング処理](https://learn.microsoft.com/ja-jp/azure/databricks/data-engineering)など全ての機能はカバーせず、[こちらのチュートリアル](https://learn.microsoft.com/ja-jp/azure/databricks/jobs/jobs-quickstart)に基づいて簡易なデータパイプラインを実装してジョブ化するところまでをカバーします。

![Screenshot 2025-01-08 at 12.52.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a7aa3565-a5d3-8bf8-e67d-1530c1da5e9e.png)

## データエンジニアリングのマインドセット

以下は個人的な経験も踏まえてのデータエンジニアリングに必要なマインドセットとなります。[こちらの記事](https://qiita.com/taka_yayoi/items/cba8021d5f368b3c77bb)も参考になります。

- ビジネスアナリストやデータサイエンティストから必要とされるデータの種類、量、鮮度、品質を理解する。
- 利用可能なデータソースを理解する。不足がある場合に入手方法を検討する。
- 格納されるデータの実態はファイルであることを理解する。
- データ読み書きのインパクトを理解する。
    - プロダクションシステムに不必要な負荷を与えない(閑散期にデータアクセスを行うなど)。
    - データ書き込み先への権限があることを確認する。
- ソースデータから分析データに至る変換ロジックをスマートに実装する。
    - [メダリオンアーキテクチャ](https://learn.microsoft.com/ja-jp/azure/databricks/lakehouse/medallion)やETL([Extract](https://qiita.com/taka_yayoi/items/08aeeac8f63a2f8158eb)、[Transformation](https://qiita.com/taka_yayoi/items/51bd9a1a895109ec1625)、Load)を理解する。
    - SQLやPython([PySpark](https://learn.microsoft.com/ja-jp/azure/databricks/pyspark/))を習熟し、必要な場合にはSparkなどを用いた並列処理を行う。
    - 洗い替えでなく[インクリメンタルな処理](https://learn.microsoft.com/ja-jp/azure/databricks/structured-streaming/incremental)や[チェンジデータキャプチャ](https://learn.microsoft.com/ja-jp/azure/databricks/delta-live-tables/cdc)を実装する。
    - [ワークフロー](https://learn.microsoft.com/ja-jp/azure/databricks/jobs/)などを活用して可能な限り自動化する。
- データエンジニアリングで使用するリソース(ジョブ、ノートブック、テーブル、ファイルなど)の所在を適切に管理する。
    - [ワークスペース](https://learn.microsoft.com/ja-jp/azure/databricks/workspace/)のコンセプトを理解する。
    - [ガバナンス](https://learn.microsoft.com/ja-jp/azure/databricks/data-governance/)の重要性を理解する。

## データエンジニアリングのチュートリアル

こちらをウォークスルーします。

https://learn.microsoft.com/ja-jp/azure/databricks/jobs/jobs-quickstart

1. インターネットからデータをダウンロードしてボリュームに保存
1. ボリュームのデータを読み込んで変換処理を適用
1. 変換したデータをテーブルに書き込み

### データ格納場所(ボリューム)の作成

このチュートリアルでは、インターネットからダウンロードしたファイルを保存します。Databricksでファイルを保存する方法はいくつかありますが、一番のおすすめは[ボリューム](https://learn.microsoft.com/ja-jp/azure/databricks/volumes/)を用いることです。チュートリアルでは`main.default.my-volume`というボリュームを使用していますが、他の方と名前が重複するので別の名前を指定して、ボリュームを作成します。

カタログエクスプローラにアクセスし、カタログ`main`、スキーマ`default`にナビゲートします。

![Screenshot 2025-01-08 at 13.11.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/27d8d2fb-fcb5-be57-0a18-13cabd3dafa2.png)

画面右上の**作成 > ボリュームを作成**をクリックします。

![Screenshot 2025-01-08 at 13.13.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bef89b29-1e60-28c8-a829-fdb847471032.png)

ボリュームの作成ダイアログが表示されます。

![Screenshot 2025-01-08 at 13.14.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/49196553-84f6-29c3-cdb0-44d649c03c4a.png)

ご自身の名前など他の方と重複しない名前を入力し、ボリュームタイプは管理ボリュームのままとし、オプションでコメントを入力して**作成**をクリックします。ここでは、`taka-yayoi-volume`という名前にしています。

![Screenshot 2025-01-08 at 13.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/50ae14fc-218b-45b8-b6ae-5b7a9725d2cb.png)

これで、`main.default.taka-yayoi-volume`という名前空間でアクセスできるボリュームが作成されました。このボリュームのファイルパスは`/Volumes/main/default/taka-yayoi-volume`となります。

![Screenshot 2025-01-08 at 13.16.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/302a6fe4-2fdb-49f3-9fff-63a3565387c9.png)

:::note info
ボリュームが作成できない場合には、Databricks管理者にあなた自身が[こちらの要件](https://learn.microsoft.com/ja-jp/azure/databricks/jobs/jobs-quickstart#requirements)を満たしているのかをご確認ください。
:::

### ジョブ用ノートブックの作成

データパイプラインは[ノートブック](https://learn.microsoft.com/ja-jp/azure/databricks/notebooks/)で実装します。

#### データ取り込みノートブック

まず、ETLにおけるE(Extract)の処理を実装します。

ノートブックを作成するには、サイドメニューの **+ > ノートブック** を選択します。

![Screenshot 2025-01-08 at 13.21.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/796823ef-efff-e6e0-a835-a7dfdc1a37cd.png)

ノートブックが開きます。こちらにPythonやSQLの言語を記述することで、データパイプラインを実装します。Databricksにおけるデータエンジニアリングでは、ノートブックを用いた開発を頻繁に行うので、[こちら](https://learn.microsoft.com/ja-jp/azure/databricks/notebooks/)を参考にUIや使い方に習熟するようにしましょう。ノートブックでも[アシスタントを活用](https://learn.microsoft.com/ja-jp/azure/databricks/notebooks/use-databricks-assistant)することができますので、困ったことがあったらアシスタントに質問しましょう。

![Screenshot 2025-01-08 at 13.23.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ef6ff2c6-659f-8d53-3708-0080e3aa32a9.png)

ノートブックのセルに以下のコードを貼り付けます。`taka-yayoi-volume`の部分は、[上のステップ](#データ格納場所ボリュームの作成)で作成したご自身のボリュームを指定します。

```py
import requests

response = requests.get('https://health.data.ny.gov/api/views/jxy9-yhdk/rows.csv')
csvfile = response.content.decode('utf-8')
dbutils.fs.put("/Volumes/main/default/taka-yayoi-volume/babynames.csv", csvfile, True)
```

このコードでは、Pythonを用いて`https://health.data.ny.gov/api/views/jxy9-yhdk/rows.csv`のファイルをダウンロードしてボリュームに保存しています。

アシスタントにコードを説明してもらうことも可能です。セルの右上の星マークをクリックします。

![Screenshot 2025-01-08 at 13.29.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8354d653-99b3-caa7-2257-01d59e2dd0bd.png)

プロンプトボックスが開くので、以下の指示を行い**生成**をクリックします。

> 日本語でコメントして

すると、日本語でコメントが追加されます。**承認**をクリックすることで提案を確定できます。このようにして、アシスタントの助けを借りてコードの理解を深めることも可能です。

![Screenshot 2025-01-08 at 13.30.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b98b9618-bf79-ede3-feed-88628fa94b71.png)

![Screenshot 2025-01-08 at 13.31.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/33609f42-24cf-179b-08e9-650c46f8fa36.png)

ノートブックのタイトルの部分にカーソルを合わせ、`データ取り込み`というように名前を変更します。

![Screenshot 2025-01-08 at 13.34.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9a618926-453f-5e39-840c-50c84dec96be.png)

開始時刻をクリックすることで、さらに詳細表示することができます。

![Screenshot 2025-01-08 at 13.59.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4ab766cf-c08b-64a3-c9ab-a3d8f92ad0fc.png)
![Screenshot 2025-01-08 at 14.00.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/60f7c0fc-1882-46e1-f1b1-c4273cce4287.png)


#### データ変換、テーブル保存ノートブック

規模の小さいデータパイプラインであればノートブックを分ける必然性はありませんが、本番運用されるようなデータパイプラインであれば、ノートブックを分割してモジュール化する必要があります。ここでは、モジュール化を体験いただくために、データ変換のノートブックを別に作成します。また、元のノートブックではテーブルを保存していませんが、ここではダッシュボードの作成に繋げられるようにテーブルを保存します。ETLにおけるT(Transformation)とL(Load)に該当します。

再びサイドメニューの **+ > ノートブック** を選択します。

まず、今回のノートブックはSQLを記述するので、ノートブック名の隣にある[言語セレクター](https://learn.microsoft.com/ja-jp/azure/databricks/notebooks/notebooks-code#code-languages-in-notebooks)から**SQL**を選択します。その後、以下のコードを記述します。読み込みファイルのパスの`taka-yayoi-volume`やテーブル名`taka_yayoi_babynames_table`は適宜変更してください。

![Screenshot 2025-01-08 at 16.06.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/85e5dcb4-7d7d-29b3-99aa-d71ebca396c7.png)

```sql
-- CSVファイルを読み込む
CREATE OR REPLACE TEMPORARY VIEW babynames AS
SELECT * FROM read_files("/Volumes/main/default/taka-yayoi-volume/babynames.csv", header=>'true');

-- 年を整数型に変換し、2014年のデータをフィルタリング
CREATE OR REPLACE TEMPORARY VIEW babynames_transformed AS
SELECT 
  `First Name` AS First_Name,
  CAST(Year AS INT) AS Year,
  County,
  Sex,
  Count
FROM babynames
WHERE CAST(Year AS INT) = 2014;

-- テーブルに保存
CREATE OR REPLACE TABLE main.default.taka_yayoi_babynames_table AS
SELECT * FROM babynames_transformed;
```

:::note info
なお、データの変換にPython(PySpark)を使用することもできます。以下は上と同様の処理をPySparkで実装しています。

```py
# CSVファイルを読み込む
babynames = spark.read.format("csv").option("header", "true").option("inferSchema", "true").load("/Volumes/main/default/taka-yayoi-volume/babynames.csv")

# 年を整数型に変換し、2014年のデータをフィルタリング
babynames_transformed = babynames.withColumnRenamed("First Name", "First_Name").withColumn("Year", babynames["Year"].cast("int")).filter(babynames["Year"] == 2014)

# テーブルに保存
babynames_transformed.write.mode("overwrite").saveAsTable("main.default.taka_yayoi_babynames_table")
```
:::

ノートブック名を`データ変換とロード`などに変更します

![Screenshot 2025-01-08 at 13.45.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9e6d0993-faa2-b503-608d-648f98560964.png)

:::note info
今回は[ホームフォルダ](https://learn.microsoft.com/ja-jp/azure/databricks/workspace/workspace-objects#home-folder)にノートブックを作成していますが、実際に運用する際にはジョブごとにフォルダを作成することを強くお勧めします。
:::


### ジョブの作成

これでジョブを作成する準備が整いました。サイドメニューから**ワークフロー**にアクセスして、**ジョブを作成**をクリックします。

![Screenshot 2025-01-08 at 13.47.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9b77160f-f67d-b384-1cb5-6a09904c0fcc.png)

ジョブは複数のタスクから構成することができ、タスクにはノートブックやダッシュボードなどを指定することができます。ここでは、上で作成した2つのノートブックをタスクとして指定します。

![Screenshot 2025-01-08 at 13.48.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/22546a2e-361c-ed2f-5554-495f7fc55552.png)

一つ目のタスクを作成します。デフォルトはノートブックタスクになっていますので、**パス**をクリックして上の`データ取り込み`ノートブックを選択します。

![Screenshot 2025-01-08 at 13.50.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/626d8e3a-4c69-6bb3-dc70-2769e4995226.png)

タスク名は英数字とアンダースコアのみが許可されるので、`data_retrieval`といった名前にして**タスクを作成**をクリックすると、1つ目のタスクが作成されます。

![Screenshot 2025-01-08 at 13.51.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/610801b1-4a3c-f8d2-118d-5ad6fca7068e.png)

**タスクを追加 > ノートブック**をクリックして後段のタスクを作成します。

![Screenshot 2025-01-08 at 13.53.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3794fcfe-4f34-ff72-56fd-a0a89d43f52a.png)

今度はパスに`データ変換とロード`ノートブックを指定して、タスク名を`data_transform_load`として、**タスクを作成**をクリックします。

![Screenshot 2025-01-08 at 13.55.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5fc003bc-523e-ac84-4d12-13e1fe7dcd89.png)

最後にジョブ名をわかりやすいものに変更して準備は完了です。

![Screenshot 2025-01-08 at 13.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8d9e0798-cf6d-6ac4-d292-7fc7da6b3ef4.png)

### ジョブの実行

ジョブは即時実行やスケジュール実行などが可能です。即時実行するには右上の**今すぐ実行**をクリックします。

![Screenshot 2025-01-08 at 13.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/41adf673-300f-05dc-70dd-ef1075452c12.png)

**ジョブの実行**タブに切り替えると、実行中のジョブの進捗を確認できます。

![Screenshot 2025-01-08 at 13.57.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8a2d6399-0f86-067b-0a7a-88b63f63e0ea.png)

問題がなければ処理は正常終了します。

![Screenshot 2025-01-08 at 14.09.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/25681577-9860-71e3-70fb-a3de5e58b59e.png)

データパイプラインによって作成されたテーブルをカタログエクスプローラで確認することができます。

![Screenshot 2025-01-08 at 14.10.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3c794f87-6639-8660-6bd8-fba998f6898e.png)

非常にシンプルなデータパイプラインではありますが、これで一通りの実装とジョブとしての実行を体験することができました！

### ジョブのスケジュール実行

通常、ジョブは夜間に実行するなどスケジューリングすることが一般的です。ジョブの**トリガーを追加**をクリックします。

![Screenshot 2025-01-08 at 14.14.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/27b63971-ae35-4728-154f-d03b13923170.png)

トリガータイプで**スケジュール済み**を選択します。

![Screenshot 2025-01-08 at 14.15.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a468ccfb-38e6-5d7d-3757-5672d73e3ae1.png)

スケジュールのタイプで**Advanced**を選択し、タイムゾーンを**UTC+09:00**を選択して、数分後に実行されるように設定します。

![Screenshot 2025-01-08 at 14.17.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7274530f-c4b0-bcbb-1469-a341ac103a8c.png)

設定した時間になるとジョブが起動します。

![Screenshot 2025-01-08 at 14.18.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b6e2be18-418d-70de-0ed7-ba8d060da795.png)

:::note warn
スケジューリングされたジョブは定期実行されるので、不要になったジョブは一時停止あるいは削除するようにしてください。
![Screenshot 2025-01-08 at 14.19.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a3f61115-4a7a-6803-6da0-4a477789c405.png)
:::

## Databricksにおけるデータエンジニアリングの振り返り

- BIと対比してデータエンジニアリングで活用するDatabricksの機能を概観しました。
- データエンジニアリングのマインドセットをカバーしました。
- [Databricksノートブック](https://learn.microsoft.com/ja-jp/azure/databricks/notebooks/)を用いて簡単なデータパイプラインを実装しました。
- [Databrikcsワークフロー](https://learn.microsoft.com/ja-jp/azure/databricks/jobs/)を用いてデータパイプラインをジョブ化しました。

このデータパイプラインによって作成されるテーブルを用いることで、ビジネスアナリストはダッシュボードを作成できるようになります。

![Screenshot 2025-01-09 at 6.21.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/eb1eece2-4aa2-3c9e-b04a-b870a0851e69.png)

これが、データエンジニアとビジネスアナリストのコラボレーションとなるわけです。

![Screenshot 2025-01-08 at 9.52.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/191a6388-03a1-ac25-6e25-aae35e4b5590.png)

# まとめ

今回は、DatabricksにおけるBIからデータエンジニアリングへの転換の助けとなるように、それぞれの機能をウォークスルーしました。ビジネスアナリストに求められるスキルセットとデータエンジニアに求められるスキルセットは異なりますが重複する部分もあります。そして、正直なところデータエンジニアに求められるスキルセットの方が広範です。しかし、BIやデータサイエンスのみならず、昨今の生成AIの文脈においてもデータエンジニアリングは非常に重要な位置を占める技術領域となっています。綺麗なデータなしには優れたLLMやLLMアプリを実現することはできません。

DatabricksではBI、データエンジニアリングの両方の機能を提供しているので、実験を繰り返しながらBIのスキルをデータエンジニアリングのスキルに拡張、転換していくことは比較的容易だと思います。いずれのシナリオでもAIアシスタントの助けを借りることもできます。

本記事がビジネスアナリストからデータエンジニアへのロール変更を検討されている方の助けになれば幸いです。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)