DatabricksとSnowflakeをつなぐ最新データ相互利用術

## 概要

「Cross Data Platforms Meetup #1」にて、「DatabricksとSnowflakeをつなぐ最新データ相互利用術」というタイトルで発表しました。本記事では、その発表内容を整理してご紹介します。

https://cdpm.connpass.com/event/348713/

## 発表資料

<script async class="docswell-embed" src="https://www.docswell.com/assets/libs/docswell-embed/docswell-embed.min.js" data-src="https://www.docswell.com/slide/57RM6D/embed" data-aspect="0.5625"></script><div class="docswell-link"><a href="https://www.docswell.com/s/manabian/57RM6D-2025-04-22-130551">DatabricksとSnowflakeをつなぐ最新データ相互利用術 by @manabian</a></div>

## 発表内容補足

### manabian について

「データ分析基盤の構築方法論」や「関連テクノロジーの調査」、「エラー対応方法」など、データ分析の上流から下流まで幅広いテーマを扱った記事を投稿しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6cf83f1b-4a3b-ef34-96e8-b9adad87c904.png)

出所：[最強のデータ分析基盤を目指して～汎用的なデータ分析基盤の選定方法の提案～ #AWS - Qiita](https://qiita.com/manabian/items/e689daf5cc006eced737)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/571ece94-c55c-56e5-4243-7d6ad1d5be15.png)

出所：[データエンジニアリングの背景を踏まえてdbt（Data Build Tool）を少し深く理解してみる #Python - Qiita](https://qiita.com/manabian/items/ab6c2a5dde78c432ecf1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0a1b1864-405e-464e-83a9-00c7e123d4db.png)

出所：[Snowflake における Apache Iceberg の機能の完全ガイド： Apache Iceberg on Snowflake 活用の第一歩 #Spark - Qiita](https://qiita.com/manabian/items/7ba563b614e8ae016cca)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c765ed52-77e5-4600-8197-2d4f01de8ca6.png)

出所：[Google Colab の Spark にて Hadoop Catalog の Apache Iceberg の動作検証 #iceberg - Qiita](https://qiita.com/manabian/items/99aa3396bc15a28f9e10)

### データ統合と相互運用性

データ統合は、組織内に散在するデータを一貫した形式で集約するプロセスを指します。ただし、単に集約するだけではなく、システム間で連携できる“相互運用性”を確保することも重要です。また、システム面だけでなく運用体制にも配慮する必要があります。

「DMBOK（データマネジメント知識体系ガイド）」でも、データガバナンスを考える上で重要な領域の1つとしてデータ統合と相互運用性が挙げられています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1407c63b-87b8-4a0e-9149-89251c81d0c7.png)

出所：『データマネジメント知識体系ガイド　第二版』　DAMA International編著、DAMA日本支部、Metafindコンサルティング株式会社 監訳、日経BP

最新版のDMBOKでは、データ統合と相互運用性について以下のように説明されています。

> データ統合はデータストア、アプリケーション、組織の内部および相互間におけるデータの移動と統合を表している。データの相互運用性とは様々なシステムが情報を連携する能力を表す。

出所：『データマネジメント知識体系ガイド　第二版　改定新版 』　DAMA International編著、DAMA日本支部、Metafindコンサルティング株式会社 監訳、日経BP

これらについては、書籍内の第8章に詳しく解説されていますので、興味がある方はぜひご一読ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1ed5a566-f299-4a23-9731-b5f12500daf9.png)

出所：[データマネジメント知識体系ガイド 第二版 改定新版 | 日経BOOKプラス](https://bookplus.nikkei.com/atcl/catalog/24/07/02/01453/)

### 物理と仮想によるデータ統合

データ統合は、大きく「物理データ統合」と「仮想データ統合」の2つに分類されます。前者はデータを事前に移動・集約する方法で、後者はデータを移動せず仮想的に統合する方法です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/52afc081-6b41-4991-accb-89312bb6e20a.png)

物理データ統合と仮想データ統合では、それぞれ性能やコストなど異なる特性を持つため、目的や利用シーンに応じて使い分けが必要です。仮想データ統合はデータ移動が不要な点で理想的に見えますが、性能やコスト面の注意が欠かせません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/30941d58-7dce-4593-be36-bf90827e926a.png)

### データ統合が必要なケース

データ統合が必要となる主なケースは以下の4つです。近年は特に、DWH同士の連携が注目を集めています。

1. 業務系システム間でのデータ統合
1. 業務系システムからデータ分析基盤（DWH等）へのデータ統合
1. データ分析基盤（DWH等）間でのデータ統合
1. データ分析基盤（DWH等）から他システムへのデータ統合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/920a8326-40ae-47ec-8e72-d22f116f073e.png)

### DatabricksとSnowflake間のデータ統合の実施に向けて

DatabricksとSnowflakeを連携させる場合、まずはどのようにデータをロードするかを明確にし、必要となる機能を洗い出すことが重要です。下表に示すように、全件連携や差分連携などさまざまなパターンがありますが、実務で最もよく使われるのはパターン1と2です。

| #    | 連携方法            | データローディングパターン                                   |
| ---- | ------------------- | ------------------------------------------------------------ |
| 1    | 全件連携            | 最後に連携されたデータで上書きする処理                       |
| 2    | 差分連携            | 差分データを用いてUpsertする処理                            |
| 3    | 差分連携            | 特定のカラム値に基づき選択的に上書きする処理                 |
| 4    | 差分連携            | 一定期間のデータを上書きする処理                             |
| 5    | 差分連携            | 連携されたデータをAppendする処理                            |
| 6    | 履歴連携            | タイムスタンプで管理するSCD Type 2の差分履歴データを連携する処理 |
| 7    | 履歴連携            | ソースシステムの主キー列とINGEST_TIMESTAMPに基づいたUPSERT処理 |
| 8    | OTFによる連携       | Open Table Format（OTF）でデータを相互利用する方法           |

実装するパターンに応じて、必要な機能を検討する必要があります。

| #    | 機能名                                             | 概要                                                         |
| ---- | -------------------------------------------------- | ------------------------------------------------------------ |
| 1    | テーブルの上書き機能                               | テーブルデータをソースのデータで置き換える機能。CTASやOVERWRITEが典型的。 |
| 2    | 変更データ提供機能                                 | テーブルにおける変更内容を提供する機能。DELETEレコードの特定が重要。 |
| 3    | ファイル取り込み機能                               | 指定ディレクトリ上のデータを取り込む機能。ファイルのメタデータ取得や冪等性の担保が理想。 |
| 4    | データ取得機能                                     | 他システムからデータを取得する機能。                         |
| 5    | 書き込み時のスキーマ進化機能（スキーマ展開機能）    | ソースデータに応じてカラムの追加やデータ型の変更を行う機能。 |

### DatabricksとSnowflake間のデータ統合パターン

DatabricksとSnowflake間でデータ統合を行う場合、以下のような方法があります。

| データ統合方法 | Databricks -> Snowflake                                     | Snowflake -> Databricks                                      |
| -------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 全件連携       | - SparkによるOverwrite                                      | - IcebergテーブルをソースとしてCTAS<br>- 外部サービスで書き込み後にCTAS |
| 差分連携       | - CDFデータをMerge                                          | - STREAMデータをMerge                                        |
| OTFによる連携  | - UniFormでIcebergテーブル化<br>- Delta LakeをIcebergテーブル化 | （実施方法は未検証）                                         |
| 仮想データ統合 | （実施方法は未検証）                                        | - Lakehouse Federation機能を利用                             |

Databricks -> Snowflakeの差分連携については、下記の記事で詳しく整理しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/80985358-4498-49f5-8f48-2f6c8cdaa9a9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8012bc2d-38dd-4435-9ee3-55f0dc480d9e.png)

出所：[Snowflake のテーブルデータを Databricks に統合する方法の実装案 #Databricks - Qiita](https://qiita.com/manabian/items/6342f10c05d9423f5ad5)

また、Delta LakeをSnowflakeでApache Icebergテーブル化してデータ共有する方法については、下記の記事で取り上げています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/048d6206-42d8-41eb-91c7-62ef41bb42b0.png)

出所：[Databricks のデータを Snowflake の Secure Data Sharing 機能でデータ共有する際のベストプラクティス - Qiita](https://qiita.com/manabian/items/7469be5112319c4c0080)


### Databricks にてデータ統合を行う際の主要トピック

#### メダリオンアーキテクチャの採用

Databricksでデータエンジニアリングを行う場合、メダリオンアーキテクチャが推奨されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7728d463-ad09-46bc-8341-302f907d5180.png)

出所：[メダリオンアーキテクチャ (medallion architecture) | Databricks](https://www.databricks.com/jp/glossary/medallion-architecture)

具体的な実装方法については下記の記事が参考になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fdab9f83-151e-4f3f-84fb-cd4cfe65f866.png)

出所：[誰も教えてくれないメダリオンアーキテクチャの デザインメソッド：JEDA データエンジニア分科会 #1 #Python - Qiita](https://qiita.com/manabian/items/57373e833df5b4f65184)

#### チェンジデータフィード（CDF）による変更データの特定

Deltaテーブルのプロパティを有効化すると、レコードごとの変更内容を取得できるチェンジデータフィード（CDF）を利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0336c538-c127-4172-8e9d-690b24b5f488.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/aff1249a-a129-4f60-bdba-eab809adc469.png)

出所：[DatabricksでDelta Lakeのチェンジデータフィードを使用する | Databricks Documentation](https://docs.databricks.com/aws/ja/delta/delta-change-data-feed)

#### DEEP CLONEによる異なるストレージへのデータ同期

他システム連携用ストレージにデータを配置したい場合、DEEP CLONE機能を利用すると、シンプルな構文で増分連携が可能になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fc21e6ea-50e9-4ebc-b5b8-f5080f4f82d7.png)

出所：[Databricks上でテーブルをクローンする | Databricks Documentation](https://docs.databricks.com/gcp/ja/delta/clone)

#### Snowflakeへの書き込みはSparkコネクター推奨

JDBCコネクターよりもSparkコネクターを利用することで、ストレージを経由した並列処理が実行され、高い性能が期待できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e56683a6-9059-4374-9634-922ad4b17dd5.png)

出所：[Sparkコネクターの概要 | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/spark-connector-overview)

#### Auto Loaderによるファイル取り込み

DatabricksではAuto Loader機能を利用することで、クラウドストレージ上のファイルを効率的に取り込むことができます。詳細は公式ドキュメントを参照してください。

- [Auto Loaderとは | Databricks Documentation](https://docs.databricks.com/aws/ja/ingestion/cloud-object-storage/auto-loader)

#### CTAS時のスキーマ進化（スキーマ展開）と型拡張

CTASなどの書き込み処理時にスキーマ進化や型拡張が可能です。詳細は公式ドキュメントを参照してください。

- [Delta Lakeテーブルスキーマの更新 | Databricks Documentation](https://docs.databricks.com/aws/ja/delta/update-schema)
- [型の拡張 | Databricks Documentation](https://docs.databricks.com/aws/ja/delta/type-widening)

#### UniForm機能によるApache Icebergテーブルの提供

DatabricksのUniForm機能を使うと、DeltaテーブルをApache Icebergの形式で読み取り可能にできます。詳細は公式ドキュメントを参照してください。

- [Iceberg クライアントを使用した Delta テーブルの読み取り | Databricks Documentation](https://docs.databricks.com/aws/ja/delta/uniform)

#### Lakehouse Federation機能による他データストアとの論理データ統合

DatabricksにはLakehouse Federationという機能があり、他システム上のデータを論理的に統合できます。詳細は公式ドキュメントを参照してください。

- [Databricks Documentation](https://docs.databricks.com/aws/ja/query-federation/snowflake)

#### Unity Catalog有効時のApache Iceberg参照について

2025/04/22時点で、Unity Catalogが有効なクラスター上でApache Icebergテーブルを直接参照する方法は確立できていません。詳細は下記記事を参照してください。

- [Databricks にて Apache Iceberg のテーブルディレクトリからデータを取得する方法の検証 #Spark - Qiita](https://qiita.com/manabian/items/24114e65a10696d71dd9)

### Snowflakeにてデータ統合を行う際の主要トピック

#### マイクロパーティションのファイルサイズが他DWHと異なる点

Snowflakeのマイクロパーティションは他のDWHとは推奨ファイルサイズが異なるため、設計上の注意が必要です。詳細は以下の記事を参照してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c56f9820-8647-4781-b8b6-e5aecfdbba6a.png)

出所：[Snowflake における Apache Iceberg の機能の完全ガイド： Apache Iceberg on Snowflake 活用の第一歩 #Spark - Qiita](https://qiita.com/manabian/items/7ba563b614e8ae016cca#ファイルサイズによる性能面の懸念)

#### STREAM機能による変更データの特定

標準テーブルおよびIcebergテーブルでの変更データ検出にはSTREAM機能が利用できます。詳細は下記の記事を参照してください。

- [Snowflake の標準テーブルをソースとした標準 STREAM の仕様検証 #Snowflake - Qiita](https://qiita.com/manabian/items/7c80937b081b3e8fe092)
- [Snowflake-managed Apache Iceberg™ table における STREAM 機能を試してみた #iceberg - Qiita](https://qiita.com/manabian/items/1a1298fb46b70aa69065)

#### STREAM をソースとした CTAS 時にカラム追加が可能

下記の記事にて検証結果を記述しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/34e280bf-35db-4bc0-81a0-d06260fa717b.png)

出所：[Snowflake の標準テーブルをソースとした標準 STREAM の仕様検証 #Snowflake - Qiita](https://qiita.com/manabian/items/7c80937b081b3e8fe092#4-2-カラムの追加)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0825d668-29d4-450d-87fb-613b864d8392.png)

出所：[Snowflake の標準テーブルをソースとした標準 STREAM の仕様検証 #Snowflake - Qiita](https://qiita.com/manabian/items/7c80937b081b3e8fe092#5-カラムのデータ型変更)

#### COPY INTOによるファイル取り込みとスキーマ進化

SnowflakeではCOPY INTOを用いてクラウドストレージ上のファイルを取り込み、その際にスキーマを自動で進化させることもできます。詳細は公式ドキュメントを参照してください。

- [COPY INTO <テーブル> | Snowflake Documentation](https://docs.snowflake.com/ja/sql-reference/sql/copy-into-table)
- [テーブルスキーマの進化 | Snowflake Documentation](https://docs.snowflake.com/ja/user-guide/data-load-schema-evolution)

#### クラウドストレージ上のApache Icebergをテーブルとして登録可能

Snowflakeではクラウドストレージ上のApache Icebergファイルを直接テーブル登録できます。詳細は公式ドキュメントを参照してください。

- [CREATE ICEBERG TABLE (Iceberg REST カタログ) | Snowflake Documentation](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-rest)
- [CREATE ICEBERG TABLE （オブジェクトストレージ内のIcebergファイル） | Snowflake Documentation](https://docs.snowflake.com/ja/sql-reference/sql/create-iceberg-table-iceberg-files)

#### Delta Lake形式のディレクトリをApache Icebergテーブルとして登録可能

SnowflakeはDelta Lake形式のディレクトリをApache Icebergテーブルとして扱うことができます。詳細は下記の記事を参照してください。

- [Snowflake Apache Iceberg™ table を Delta Lake 形式のディレクトリから作成する機能を試してみた #iceberg - Qiita](https://qiita.com/manabian/items/7b1866cb98ce2539697a)