はじめに
「Databricks と Snowflake、両方使ってるけど連携どうすればいいの?」
こんな疑問を持っている人、結構多いんじゃないでしょうか。実際、両プラットフォームを併用しているケースは増えてきていて、データの相互運用は避けて通れない課題になっています。
この記事では、Databricks と Snowflake 間でテーブルを Read/Write する方法を調査し、網羅的にまとめました。
この記事で扱う内容
- Databricks から Snowflake のテーブルを操作する方法
- Snowflake から Databricks のテーブルを操作する方法
- 各パターンの Read/Write 可否
- カタログレベルの統合 vs コードレベルの処理指定
前提条件
- Databricks(Unity Catalog 有効化済み)
- Snowflake
- 適切なクラウドストレージへのアクセス権限
対象テーブル
- Native Table(各プラットフォームの標準テーブル)
- Iceberg Table
早見表
まずは結論から。
パターン 1:Databricks から Snowflake テーブルを操作
| 連携方式 | 統合レベル | 対象テーブル | Read | Write |
|---|---|---|---|---|
| Lakehouse Federation | カタログ | Native Table | ✅ | ❌ |
| 〃 | カタログ | Iceberg Table | ✅ | ❌ |
| Snowflake Catalog SDK | コード | Iceberg Table | ✅ | ❌ |
| Spark Connector for Snowflake (レガシー) |
コード | Native Table | ✅ | ✅ |
| 〃 | コード | Iceberg Table | ✅ | ? |
| JDBC Connector ※1 | コード | Native Table | ✅ | ✅※2 |
| 〃 | コード | Iceberg Table | ? | ? |
※1 JDBC Unity Catalog Connection の利用を推奨
※2 Python では Read/Write 可能だが、SQL では Read Only
?: 確認中です
パターン 2:Snowflake から Databricks テーブルを操作
| 連携方式 | 統合レベル | 対象テーブル | Read | Write |
|---|---|---|---|---|
| カタログ統合 (Iceberg REST Catalog) |
カタログ | Iceberg Table | ✅ | ✅ |
| 〃 | カタログ | Delta Table | ✅ | ❌ |
| Delta Sharing | カタログ | Delta Table | ✅ | ❌ |
| 〃 | カタログ | Iceberg Table | ✅ | ❌ |
| 〃 ※3 | カタログ | Federated Table | ❌ | ❌ |
※3 Lakehouse Federation で統合したテーブルを Delta Share できますが、現時点で Iceberg 形式で共有はできないようです
凡例: ✅ 対応 / ⚠️ 制限あり / ❌ 非対応
補足:Snowflake から Databricks への「Spark Connector」について
Snowflake には Notebook 以外では Spark 実行環境がないと理解しています。
そのため、Spark Connector は Snowflake 側からは Notebook 以外から直接利用できません。
各パターンの詳細
【Databricks → Snowflake】Databricks から Snowflake のテーブルを操作する
Databricks から Snowflake にアクセスする方法は大きく分けて 2 種類あります:
- カタログレベル(Lakehouse Federation)
- コードレベル(Connector 系)
2.1 Lakehouse Federation(クエリフェデレーション)
Unity Catalog の Foreign Catalog 機能を使って、Snowflake のテーブルを Unity Catalog に自動的に登録する方法。SQL でシームレスにアクセスできるのが強み。
統合レベル: カタログ
セットアップ
以下を参照:クエリフェデレーションとは何ですか?
使い方
-- 普通に SELECT するだけ
SELECT * FROM snowflake_catalog.schema_name.table_name;
Native Table / Iceberg Table の Read
設定が終われば、あとは普通のテーブルと同じようにアクセスできる。Native Table も Iceberg Table も同様に Read 可能です。
ただし、クエリフェデレーション経由は 読み取り専用。Write したい場合は Connector を使い、テーブルレベルでコード内で指定して利用する必要があります。
2.2 Lakehouse Federation(カタログフェデレーション)
Snowflake の Iceberg Table に対して、カタログ統合を行う方法。こちらも 読み取り専用 。
統合レベル: カタログ
セットアップ
Query Federation とほぼ同様ですが、少し違いがあります。
以下を参照:Snowflake カタログフェデレーションを有効にする
※ Document が非常に分かりづらいため以下補足します。
- Iceberg のファイルが存在する Location に対して、External Location を作成。これはその Location に対してアクセスするための認証情報を設定するという意味もあります。
- Foreign Catalog を作成する際に、以下を設定
- Storage Location(ストレージの場所): Databricks が Iceberg テーブルを読み取る際に利用するメタデータを作成・保存する場所。好きな Location で大丈夫です。
- Authentication Path(認証パス): Iceberg ファイルが存在するパスを含むパス。複数設定が可能。
上記が正しく設定されていない場合、Catalog Federation ではなく Query Federation として動作します。
なお、Native Table 及び Iceberg Table の両方を含むカタログ・スキーマに対して Catalog Federation を設定した場合は、Native は Query Federation、Iceberg は Catalog Federation として自動的に処理が切り替わります。
使い方
-- 普通に SELECT するだけ
SELECT * FROM snowflake_catalog.schema_name.table_name;
Iceberg テーブルがオープンな形式で保存されているからこそできる芸当。双方向連携したいなら、Iceberg を軸にするのがおすすめ。
2.3 Snowflake Catalog SDK (非推奨)
Apache Iceberg の SparkCatalog として Snowflake を利用する方法。Snowflake の Iceberg テーブルに対して、Spark ネイティブな方法でアクセスできる。
Read Only であり、Databricks Lakehouse Federation でカバーできるため、利用は非推奨。
統合レベル: コード
セットアップ
以下を参照
Snowflake カタログ SDK
使い方
上記リンクに記載有り。Spark セッションに Snowflake のカタログを設定した後は通常の Spark の使い方と同じ。以下イメージ。
# カタログの設定
spark.sessionState.catalogManager.setCurrentCatalog("snowflake_catalog")
# テーブル一覧の確認
spark.sql("SHOW NAMESPACES").show()
spark.sql("SHOW TABLES").show()
# テーブルの読み取り
df = spark.table("my_database.my_schema.my_iceberg_table")
df.show()
注意点
- Read のみ対応。Write は現時点ではサポートされていない
- Iceberg テーブル以外の Snowflake テーブルにはアクセスできない
- Lakehouse Federation(カタログフェデレーション)と比べると、設定がコードベースになる
2.4 Spark Connector for Snowflake
Snowflake が公式に提供している Spark 用コネクタ。一番オーソドックスな方法で、Read/Write 両方可能。
統合レベル: コード
セットアップ
特に不要です。
※ Databricks としてはレガシーの機能なので、今後の DBR のバージョン次第では削除される可能性があります。
使い方
以下をご参照ください (タイトルが分かりづらいですね.)
Snowflake からのデータの読み取りと書き込み
2.5 JDBC Connector for Snowflake
JDBC ドライバーを使った汎用的な接続方法。どんな環境でも使えるのがメリットだけど、パフォーマンスは Spark Connector に劣るためあまりメリットはない。
Snowflake に限らず、他の DB/DWH に接続する際でも利用できる。
統合レベル: コード
セットアップ
Snowflake JDBC Driver を以下よりダウンロードし、Databricks Unity Catalog 上の Volume に配置する
JDBC ドライバーのダウンロード/統合
Unity Catalog の接続(Connection)の新規作成にて、JDBC を選択し、上記 Volume を指定した上で作成を進める。UI、または SQL で作成可能。
JDBC Unity Catalog 接続
※ Snowflake の認証情報等の接続設定は以下をご参照
JDBC ドライバーの構成
作成した Connection を利用し、クエリを実行
df = (
spark.read.format('jdbc')
.option('databricks.connection', '<JDBC-connection-name>')
.option('query', 'select * from <table_name>') # Database native SQL
.load()
)
df.display()
SELECT * FROM
remote_query('<JDBC-connection-name>', query => 'SELECT * FROM <table>');
注意点
- 大量データの場合はパフォーマンスに注意
- SQL (remote_query)は Read Only。
【Snowflake → Databricks】Snowflake から Databricks のテーブルを操作する
3.1 カタログ統合(Iceberg REST Catalog)
Unity Catalog が Iceberg REST Catalog API を公開しているので、これを使えば Snowflake から Databricks の Delta/Iceberg テーブルにアクセスできる。Iceberg については Read/Write 両方可能だが、Delta はRead Only。
統合レベル: カタログ
前提
- Unity Catalog の外部アクセスが有効化されている
セットアップ
弊社社員が書いた以下記事がわかりやすいため、こちらをご参照ください
Unity Catalog の Iceberg REST Catalog API 対応
いくつか補足します。
Unity Catalog の REST Catalog API エンドポイントは、以前から変更されています。
後者はレガシーであり、Read Only な Endpoint となっています。Deprecated(非推奨)となる可能性もあるので、iceberg-rest の方を利用するようにしてください。
現在: https://<workspace-url>/api/2.1/unity-catalog/iceberg-rest
以前: https://<workspace-url>/api/2.1/unity-catalog/iceberg
また、Snowflake 上で Create Catalog Integration をした後、Databricks 上の各 Iceberg テーブルに対して、Snowflake 上で CREATE ICEBERG TABLE をしています。
こちらは現在、Catalog Linked Database という機能により、テーブルレベルではなく、カタログ/スキーマレベルでの自動統合も可能になっています。
以前はこの Catalog Linked Database を利用した場合、外部カタログへの書き込みができなかったのですが、現在はその制約はなく、Read/Write の両方が可能になっているようです。
カタログリンクデータベースの使用
なお上記リンクに記載がある通り、カタログリンクデータベースには若干のコストが発生する可能性があるようですが、基本的に Snowflake を日常で使っている場合には発生しない、あるいは無視できるレベルの金額のように見えます。
また、Databricks の Delta/Iceberg Table の現在のバージョンは V2 です。
V2 では、Deletion Vector や Variant 型、行レベルの増分変更の追跡がサポートされておらず、これらの機能・内容を含むテーブルでは有効化できません。
現在、Iceberg V3 の機能がベータで出ているため、もし上記機能を Iceberg クライアント等でも利用したい場合は以下に従ってください。
クライアント側(今回は Snowflake)でも V3 に対応している必要がありますので、ご注意ください。
Apache Iceberg v3 の機能を使用する
3.2 Delta Sharing
Databricks 側で Delta Sharing を設定していれば、Snowflake から Databricks が共有した Delta/Iceberg データを読めます。
こちらを使うことで、Databricks 上のカタログ構造のままの共有ではなく、独自の体系に Share するスキーマやテーブル群をまとめて Share することが可能です。
Iceberg Client 向けの Delta Sharing は現在プライベートプレビュー中のため、詳細は省略しますが、以下のリンクの、以下セクションサマリが記載されています。
External data collaboration with Apache Iceberg™ and Delta Sharing
What's New with Data Sharing and Collaboration - Summer 2025
また、Lakehouse Federation で統合したテーブルを Delta Sharing することは可能ですが、現時点で Iceberg Client での読み取りには対応していないようです。
参考までに、Lakehouse Federation のテーブルを Delta Share する方法は以下となります。
外部スキーマまたはテーブルを共有に追加する
※マテリアライズされたテーブルは、ワークスペースの設定で指定してあるデフォルトカタログ内の隠されたスキーマに保存されます。
※こちらはサポートにお問い合わせ頂くことで、ご指定のカタログ/スキーマに保存されるように変更することが可能なようです。
ユースケース別おすすめ構成
| ユースケース | おすすめ方式 | 理由 |
|---|---|---|
| Snowflake から Databricks のテーブルに Write したい | Databricks Managed Iceberg + Snowflake Catalog Linked Database | Iceberg Client(Snowflake)から Write するには基本これ |
| Snowflake から Databricks のテーブルが Read できれば良い | Snowflake Catalog Linked Database、Delta Sharing | カタログレベルでの統合が可能、また Delta Sharing ならカタログ構造に依存しない |
| Databricks から Snowflake のテーブルを Write したい | Snowflake Spark Connector | 唯一、Databricks から Snowflake に Read/Write できるパターンだが、、、 |
| Databricks から Snowflake のテーブルを Read したい | Lakehouse Federation | Snowflake のテーブルを Databricks に統合する上で最もシンプル |
| Databricks と Snowflake の双方から Write したい | Databricks Managed Iceberg | 双方から Write できる最も容易でシンプルな手法(が、本当に双方向 Write の必要性はあるのか…?) |
ただし、パフォーマンス観点や運用性の観点から、各種機能の特性を踏まえてご検討ください。
まとめ
Databricks も Snowflake も、どんどん新しい機能を出していて追いつくのが大変ですね。
両方のいいとこ取りをしたい、既存で片方があるので組み合わせたいという要望は今後も増えていくと思います。
その際に、本内容が役に立てば幸いです。
※個人で調査した情報になるため、誤りを含む可能性はございます。
ご意見、ご指摘がございましたら、ビシバシコメント頂けると幸いです!