次の方法で共有


Snowflake でフェデレーション クエリを実行する

この記事では、Azure Databricks で管理されていない Snowflake データに対してフェデレーション クエリを実行できるように、レイクハウス フェデレーションを設定する方法について説明します。 Lakehouse フェデレーションの詳細については、「Lakehouse フェデレーションとは」を参照してください。

レイクハウス フェデレーションを使って Snowflake データベースに接続するには、Azure Databricks の Unity Catalog メタストアで次のものを作成する必要があります。

  • Snowflake データベースへの "接続"。
  • Unity Catalog で Snowflake データベースをミラーリングする "外部カタログ"。これにより、Unity Catalog のクエリ構文とデータ ガバナンス ツールを使って、Azure Databricks ユーザーのデータベースへのアクセスを管理できるようになります。

Snowflake では、データベース フェデレーションまたはカタログ フェデレーションを使用してフェデレーション クエリを実行できます。 カタログ フェデレーションを使用した Snowflake でのフェデレーション クエリの実行を参照してください。

データベースフェデレーションでは、JDBC は Unity カタログ クエリを外部データベースにプッシュします。 これは、ETL パイプラインでのアドホック レポートまたは概念実証作業に最適です。

カタログ フェデレーションでは、Unity カタログ クエリはファイル ストレージに対して直接実行されます。 このアプローチは、コードの適応を伴わない増分移行や、Unity カタログに登録されているデータと共に Snowflake のデータを保持する必要がある組織向けの長期的なハイブリッド モデルとして役立ちます。

データベース フェデレーションを使用して Snowflake でフェデレーション クエリを実行する

始める前に

ワークスペースの要件:

  • Unity Catalog を使用できるワークスペース。

コンピューティングの要件:

  • コンピューティング リソースからターゲット データベース システムへのネットワーク接続。 「レイクハウス フェデレーションのためのネットワークに関する推奨事項」を参照してください。
  • Azure Databricks コンピューティングでは、Databricks Runtime 13.3 LTS 以降を使用し、Standard または デディケート アクセス モードを使用する必要があります。
  • SQL ウェアハウスはプロまたはサーバーレスである必要があり、2023.40 以降を使用する必要があります。

必要なアクセス許可:

  • 接続を作成するには、メタストア管理者であるか、ワークスペースにアタッチされている Unity Catalog メタストアに対する CREATE CONNECTION 特権を持つユーザーである必要があります。
  • 外部カタログを作成するには、メタストアに対する CREATE CATALOG 権限を持ち、接続の所有者であるか、接続に対する CREATE FOREIGN CATALOG 特権を持っている必要があります。

追加の権限要件は、以下の各タスク ベースのセクションで規定されています。

  • OAuth を使用して認証する予定の場合は、Snowflake コンソールでセキュリティ統合を作成します。
  • OAuth アクセス トークンを使用して認証する場合は、アクセス トークンも要求する必要があります。

(省略可能) Snowflake コンソールでセキュリティ統合を作成する

OAuth を使用して認証する場合は、Snowflake 接続を作成する前に、この手順に従います。 代わりにユーザー名とパスワードを使用して認証するには、このセクションをスキップしてください。

Snowflake の組み込みの OAuth 統合のみがサポートされています。 Okta や Microsoft Entra ID などの外部 OAuth 統合はサポートされていません。

Snowflake コンソールで、CREATE SECURITY INTEGRATION を実行します。 次の値を置き換えます。

  • <integration-name>: OAuth 統合の一意の名前。

  • <workspace-url>: Azure Databricks ワークスペースの URL。 OAUTH_REDIRECT_URIhttps://<workspace-url>/login/oauth/snowflake.html に設定する必要があります。<workspace-url> は、Snowflake 接続を作成する Azure Databricks ワークスペースの一意の URL です。

  • <duration-in-seconds>: 更新トークンの時間の長さ。

    重要

    OAUTH_REFRESH_TOKEN_VALIDITY は、既定で 90 日に設定されているユーザー設定フィールドです。 更新トークンの有効期限が切れると、接続を再認証する必要があります。 フィールドを適切な時間長に設定します。

CREATE SECURITY INTEGRATION <integration-name>
TYPE = oauth
ENABLED = true
OAUTH_CLIENT = custom
OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'
OAUTH_REDIRECT_URI = 'https://<workspace-url>/login/oauth/snowflake.html'
OAUTH_ISSUE_REFRESH_TOKENS = TRUE
OAUTH_REFRESH_TOKEN_VALIDITY = <duration-in-seconds>
OAUTH_ENFORCE_PKCE = TRUE;

(省略可能)OAuth アクセス トークンを要求する

方法: Snowflake ナレッジ ベースのカスタム クライアントに対して Snowflake OAuth を使用して OAuth トークンを生成して使用する方法に従います。

接続を作成する

接続では、外部データベース システムにアクセスするためのパスと資格情報を指定します。 接続を作成するには、Catalog Explorer を使用するか、Azure Databricks ノートブックまたは Databricks SQL クエリ エディターで CREATE CONNECTION SQL コマンドを使用します。

Databricks REST API または Databricks CLI を使用して接続を作成することもできます。 POST /api/2.1/unity-catalog/connections および Unity Catalog コマンドを参照してください。

必要な権限: メタストア管理者、または CREATE CONNECTION 特権を持つユーザー。

カタログ エクスプローラー

  1. Azure Databricks ワークスペースで、[ データ] アイコンをクリックします。カタログ

  2. [カタログ] ペインの上部にある 追加またはプラス アイコン[追加] アイコンをクリックし、メニューから [接続の追加] を選択します。

    または、[クイック アクセス] ページで、[外部データ >] ボタンをクリックし、[接続] タブに移動し、[接続の作成] をクリックします。

  3. 接続 のセットアップ ウィザードの [接続の基本] ページで、わかりやすい 接続名入力します。

  4. Snowflake[接続の種類] を選択します。

  5. [認証の種類] で、ドロップダウン メニューから Username and password (基本認証)、OAuth access tokenPEM Private Key、またはOAuthを選択します。

  6. (省略可能) コメントを追加します。

  7. [次へ] をクリックします。

  8. Snowflake ウェアハウスの以下の認証情報と接続情報を入力します。 選択した認証方法に固有のプロパティの前には、かっこで囲まれた Auth type が付きます。

    • ホスト: たとえば、snowflake-demo.east-us-2.azure.snowflakecomputing.com

    • ポート: たとえば、443

    • ユーザー: たとえば、snowflake-user

    • (基本認証) パスワード: 例: password123

    • (OAuth アクセス トークン) アクセス トークン: アクセス トークン (省略可能) OAuth アクセス トークンを要求します

    • (OAuth アクセス トークン) 秒で期限切れ: アクセス トークンの有効期限 (秒単位) (省略可能) OAuth アクセス トークンの要求 (expires_in)。

    • (OAuth) クライアント ID: Snowflake コンソールで、 SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('<security-integration-name>') を実行して、セキュリティ統合のクライアント ID を取得します。

    • (OAuth) クライアント シークレット: Snowflake コンソールで、 SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS('<security-integration-name>') を実行して、セキュリティ統合用のクライアント シークレットを取得します。

    • (OAuth) OAuth スコープ: refresh_token session:role:<role-name><role-name> で使用する Snowflake ロールを指定します。

    • (OAuth) Snowflake でサインインする: OAuth 資格情報を使用して、Snowflake にクリックしてサインインします。

    • (PEM 秘密キー) PEM 秘密キー: HEX64 形式の RSA キーの秘密キー。

    • (PEM 秘密キー)(省略可能) 秒で期限切れ: 秘密キーで作成された接続の有効期限 (秒単位)。 指定しない場合、デフォルトでは有効期限はありません。

      サインインが成功すると、 接続のセットアップ ウィザードに戻ります。

  9. [接続の作成] をクリックします。

  10. (基本認証)[ 接続の詳細 ] ページで、次を指定します。

    • Snowflake ウェアハウス: たとえば、my-snowflake-warehouse
    • (省略可能) プロキシ ホスト: Snowflake への接続に使用されるプロキシのホスト。 [ プロキシの使用 ] を選択し、[ プロキシ ポート] を指定する必要もあります。
    • (省略可能) プロキシを使用する: プロキシ サーバーを使用して Snowflake に接続するかどうかを指定します。
    • (省略可能) プロキシ ポート: Snowflake への接続に使用されるプロキシのポート。 [ プロキシの使用 ] を選択し、[ プロキシ ホスト] を指定する必要もあります。
    • (省略可能) Snowflake ロール: 接続後にセッションに使用する既定のセキュリティ ロール。
  11. [次へ] をクリックします。

  12. カタログの基本 ページで、外部カタログの名前を入力します。 外部カタログは、外部データ システム内のデータベースをミラーリングし、Azure Databricks と Unity Catalog を使ってそのデータベース内のデータに対するクエリの実行とアクセス管理ができるようにします。

  13. (省略可能) [接続のテスト] をクリックして、動作することを確認します。

  14. カタログを作成 をクリックします。

  15. [Access] ページで、作成したカタログにユーザーがアクセスできるワークスペースを選択します。 [すべてのワークスペースにアクセス権を持たせる] を選択するか、[ワークスペースへの割り当て] をクリックしてワークスペースを選択し、[割り当て] をクリックします。

  16. カタログ内のすべてのオブジェクトへのアクセスを管理できる 所有者 を変更します。 テキストボックスに主要項目を入力し、表示された結果からその項目をクリックします。

  17. カタログに関する権限 を付与します。 [許可] をクリックします。

    1. カタログ内のオブジェクトにアクセスできる プリンシパル を指定します。 テキストボックスに主要項目を入力し、表示された結果からその項目をクリックします。
    2. 各プリンシパルに付与する 特権プリセット を選択します。 既定では、すべてのアカウント ユーザーに BROWSE が付与されます。
      • ドロップダウン メニューから [データ 閲覧者 を選択して、カタログ内のオブジェクトに対する read 権限を付与します。
      • ドロップダウン メニュー データ エディター を選択して、カタログ内のオブジェクトに対する read 権限と modify 権限を付与します。
      • 付与する特権を手動で選択します。
    3. [許可] をクリックします。
  18. [次へ] をクリックします。

  19. [メタデータ] ページで、タグのキーと値のペアを指定します。 詳細については、「Unity カタログのセキュリティ保護可能なオブジェクトにタグを適用する」を参照してください。

  20. (省略可能) コメントを追加します。

  21. [保存] をクリックします。

SQL

ノートブックまたは Databricks SQL クエリ エディターで次のコマンドを実行します。

CREATE CONNECTION <connection-name> TYPE snowflake
OPTIONS (
  host '<hostname>',
  port '<port>',
  sfWarehouse '<warehouse-name>',
  user '<user>',
  password '<password>'
);

資格情報などの機密性の高い値には、プレーンテキストの文字列ではなく Azure Databricks のシークレットを使用することをお勧めします。 次に例を示します。

CREATE CONNECTION <connection-name> TYPE snowflake
OPTIONS (
  host '<hostname>',
  port '<port>',
  sfWarehouse '<warehouse-name>',
  user secret ('<secret-scope>','<secret-key-user>'),
  password secret ('<secret-scope>','<secret-key-password>')
)

シークレットの設定については、「シークレットの管理」を参照してください。

外部カタログを作成する

UI を使用してデータ ソースへの接続を作成する場合は、外部カタログの作成が含まれるので、この手順は省略できます。

外部カタログは、外部データ システム内のデータベースをミラーリングし、Azure Databricks と Unity Catalog を使ってそのデータベース内のデータに対するクエリの実行とアクセス管理ができるようにします。 外部カタログを作成するには、定義済みのデータ ソースへの接続を使用します。

外部カタログを作成するには、Catalog Explorer を使用するか、Azure Databricks ノートブックまたは SQL クエリ エディターで CREATE FOREIGN CATALOG SQL コマンドを使用します。 Databricks REST API または Databricks CLI を使用してカタログを作成することもできます。 POST /api/2.1/unity-catalog/catalogs および Unity Catalog コマンドを参照してください。

必要なアクセス許可: メタストアに対する CREATE CATALOG アクセス許可と、接続の所有権または接続に対する CREATE FOREIGN CATALOG 特権。

カタログ エクスプローラー
  1. Azure Databricks ワークスペースで、[ データ] アイコンをクリックします。カタログ をクリックしてカタログ エクスプローラーを開きます。

  2. [カタログ] ペインの上部にある 追加またはプラス アイコン[追加] アイコンをクリックし、メニューから [カタログの追加] を選択します。

    または、[クイック アクセス] ページで、[カタログ] ボタンをクリックし、[カタログの作成] ボタンをクリックします。

  3. カタログを作成する」で外部カタログを作成する手順に従います。

SQL

ノートブックまたは SQL クエリ エディターで次のコマンドを実行します。 角かっこ内の項目は省略可能です。 プレースホルダー値を次のように置き換えます。

  • <catalog-name>: Azure Databricks 内のカタログの名前。
  • <connection-name>: データ ソース、パス、アクセス資格情報を指定する接続オブジェクト
  • <database-name>: Azure Databricks でカタログとしてミラーリングするデータベースの名前。
CREATE FOREIGN CATALOG [IF NOT EXISTS] <catalog-name> USING CONNECTION <connection-name>
OPTIONS (database '<database-name>');

大文字と小文字を区別するデータベース識別子

外部カタログの database フィールドは、Snowflake データベース識別子にマップされます。 Snowflake データベース識別子で大文字と小文字が区別されない場合、外部カタログ <database-name> で使用する大文字と小文字が保持されます。 ただし、Snowflake データベース識別子で大文字と小文字が区別される場合は、大文字と小文字を区別するために、外部カタログ <database-name> を二重引用符で囲む必要があります。

次に例を示します。

  • databaseDATABASE に変換されます

  • "database"database に変換されます

  • "database"""database" に変換されます

    二重引用符をエスケープするには、別の二重引用符を使用します。

  • "database"" は、二重引用符が正しくエスケープされないため、エラーになります。

詳細については、Snowflake ドキュメントの「識別子の要件」を参照してください。

サポートされているプッシュダウン

以下のプッシュダウンがサポートされています。

  • フィルター
  • プロジェクション
  • 制限
  • 結合
  • 集計 (Average、Corr、CovPopulation、CovSample、Count、Max、Min、StddevPop、StddevSamp、Sum、VariancePop、VarianceSamp)
  • 関数 (文字列関数、数学関数、データ関数、時刻関数、タイムスタンプ関数、その他 Alias、Cast、SortOrder などの関数)
  • Windows 関数 (DenseRank、Rank、RowNumber)
  • 並べ替え

データ型マッピング

Snowflake から Spark に読み取ると、データ型は次のようにマップされます。

Snowflake の型 Spark の型
decimal、number、numeric 10進型
bigint、byteint、int、integer、smallint、tinyint インテジャータイプ
float、float4、float8 フロート型
double、double precision、real ダブルタイプ
char、character、string、text、time、varchar 文字列型
[バイナリ] バイナリタイプ
Boolean BooleanType
日付 デートタイプ
datetime、timestamp、timestamp_ltz、timestamp_ntz、timestamp_tz タイムスタンプ型

OAuth の制限事項

OAuth サポートの制限事項を次に示します。

  • Snowflake OAuth エンドポイントには、Azure Databricks コントロール プレーン IP からアクセスできる必要があります。 Azure Databricks コントロール プレーンからの送信を参照してください。 Snowflake では、セキュリティ統合レベルでのネットワーク ポリシーの構成がサポートされています。これにより、承認のために Azure Databricks コントロール プレーンから OAuth エンドポイントへの直接接続を可能にする別のネットワーク ポリシーが可能になります。
  • プロキシの使用プロキシ ホストプロキシ ポート、Snowflake ロールの構成オプションはサポートされていません。 OAuth スコープの一部として Snowflake ロールを指定します。

PEM 秘密キーの制限事項

PEM 秘密キーのサポートの制限事項を次に示します。

  • Snowflake JDBC ドライバーは、暗号化された秘密キーによる認証をサポートしていません。 エラーを回避するには、次のように、 -nocrypt オプションを追加してキーを生成します。

    openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
    

カタログ フェデレーションを使用して Snowflake でフェデレーション クエリを実行する

要求事項

カタログ フェデレーションを使用して Snowflake でフェデレーション クエリを実行するには、次の要件を満たす必要があります。

  • Snowflake Horizon Catalog をフェデレーションするための要件を満たします。 要件を参照してください。
  • Databricks Runtime 16.4 LTS 以降、または Databricks SQL を使用します。

カタログ フェデレーションを設定する

カタログ フェデレーションを設定する手順は、データベース フェデレーションの設定と似ています。 ただし、Snowflake に登録されている Apache Iceberg テーブルへのパスのストレージ資格情報と外部の場所も作成する必要があります。

  1. Iceberg テーブルの外部の場所を作成します。

    Snowflake データベースに登録されている Iceberg テーブルを保持するクラウド ストレージの場所へのアクセスを制御するには、Unity カタログの外部の場所を構成する必要があります。 外部の場所は、ストレージ資格情報をクラウド ストレージ コンテナー パスに関連付ける Unity カタログセキュリティ保護可能なオブジェクトです。 ストレージ資格情報と外部の場所に関するページを参照してください。

    外部の場所を作成できます。

    この外部の場所は、外部カタログ構成の一部として、手順 3 で承認されたパスとして指定されます。

  2. データベース フェデレーションと同様に、 Snowflake Horizon Catalog への接続を作成します

  3. データベースフェデレーションと同様に、 外部カタログを作成します。 このカタログ内の Iceberg テーブルのメタデータを格納するクラウド ストレージ内の場所を指定する必要があります。

    カタログに格納場所を構成すると、オブジェクト ストレージを介して外部カタログ内の Iceberg テーブルを読み取ります。 JDBC プロトコルを使用した Iceberg テーブルの読み取りまたは書き込みは使用できなくなります (Iceberg 以外のテーブルは影響を受けません)。

    また、 承認済みパス (カタログ経由でアクセスできるクラウド ストレージ パス) も追加する必要があります。 これらのパスに該当するテーブルのみを、フェデレーション カタログ経由で照会できます。 パスは外部の場所でカバーされている必要があります。

外部の Snowflake テーブルがカタログまたはデータベースのフェデレーションを使用しているかどうかを判断する

カタログ フェデレーションを使用して読み取られた外部 Snowflake テーブルは、カタログ エクスプローラーに Iceberg ソース形式を表示します。 データベース フェデレーションを使用して読み取られた Iceberg テーブルには、カタログ エクスプローラーに Snowflake ソース形式が表示されます。

フェデレーション Snowflake カタログには、Snowflake 組み込みテーブルと Iceberg テーブルの両方を含めることができます。 両方のストレージ形式のテーブルに対して実行されるクエリは、Snowflake コンピューティングを使用するデータベース フェデレーションを使用して実行されます。

既知の制限事項

カタログ フェデレーションを使用した Snowflake でのフェデレーション クエリの実行には、次の制限があります。

  • 一部の iceberg テーブルは、データベース フェデレーションを使用してのみ読み取ることができます。
    • URI と互換性のない場所 (特殊文字を含む) を持つテーブル。
    • テーブルの場所の外部にあるメタデータの場所を持つテーブル。
    • サポートされていないスキームを持つテーブル ( s3s3as3nabfsabfssgsr2wasb、および wasbs のみがサポートされます)。
  • 大文字小文字を無視した場合、名前が同じテーブルが競合します。 最初に読み込まれるテーブルがそのまま表示されます。
  • Azure の場合、Snowflake Iceberg テーブルをコンテナーのルートの場所に配置することはできません。

Iceberg 関連の制限事項については、Iceberg テーブルの制限事項を参照してください。

その他のリソース

Snowflake ドキュメントの次の記事を参照してください。