PostgreSQL に対してフェデレーション クエリを実行する

重要

この機能はパブリック プレビュー段階にあります。

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

レイクハウス フェデレーションを使って PostgreSQL データベースに対する自分のクエリの実行に接続するには、Azure Databricks の Unity Catalog メタストアで以下を作成する必要があります。

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

準備

ワークスペースの要件:

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

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

  • Databricks Runtime クラスターまたは SQL ウェアハウスから対象となる データベース システムに接続するためのネットワーク接続。 「レイクハウス フェデレーションのためのネットワークに関する推奨事項」を参照してください。
  • Azure Databricks クラスターでは、Databricks Runtime 13.3 LTS 以降、および共有またはシングルユーザー アクセス モードを使用する必要があります。
  • SQL ウェアハウスは、Pro またはサーバーレスである必要があります。

必要なアクセス許可:

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

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

接続を作成する

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

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

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

  1. Azure Databricks ワークスペースで、カタログ アイコンカタログ をクリックします。
  2. 左側のペインで [外部データ] メニューを展開し、[接続] を選択します。
  3. [接続の作成] をクリックします。
  4. わかりやすい接続名を入力します。
  5. PostgreSQL[接続の種類] を選択します。
  6. PostgreSQL インスタンスの接続プロパティを以下のように入力します。
    • ホスト: たとえば、postgres-demo.lb123.us-west-2.rds.amazonaws.com
    • ポート: たとえば、5432
    • ユーザー: たとえば、postgres_user
    • パスワード: たとえば、password123
  7. (省略可能) [接続のテスト] をクリックして、動作することを確認します。
  8. (省略可能) コメントを追加します。
  9. Create をクリックしてください。

Sql

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

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

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

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

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

外部カタログを作成する

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

外部カタログを作成するには、Catalog Explorer を使用するか、Azure Databricks ノートブックまたは Databricks SQL クエリ エディターで CREATE FOREIGN CATALOG SQL コマンドを使用します。

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

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

  1. Azure Databricks ワークスペースで、カタログ アイコンカタログ をクリックします。
  2. [カタログの作成] ボタンをクリックします。
  3. [新しいカタログの作成] ダイアログで、カタログの名前を入力し、[外部][種類] を選択 します。
  4. Unity Catalog のカタログとしてミラーリングするデータベースへのアクセスを提供する接続を選択します。
  5. カタログとしてミラーリングするデータベースの名前を入力します。
  6. [Create (作成)] をクリックします。

Sql

ノートブックまたは Databricks 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>');

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

すべてのコンピューティングで以下のプッシュダウンがサポートされています:

  • フィルター
  • プロジェクション
  • 制限
  • 関数: 部分的。フィルター式の場合のみ。 (文字列関数、数学関数、データ関数、時刻関数、タイムスタンプ関数、その他 Alias、Cast、SortOrder などの関数)

Databricks Runtime 13.3 LTS 以上および SQL ウェアハウスでは、以下のプッシュダウンがサポートされています。

  • 次の集計関数: MIN、MAX、COUNT、SUM、AVG、VAR_POP、VAR_SAMP、STDDEV_POP、STDDEV_SAMP、GREATEST、LEAST、COVAR_POP、COVAR_SAMP、CORR、REGR_INTERCEPT、REGR_R2、REGR_SLOPE、REGR_SXY
  • 次のブール関数: =、<、<、=>、>=、<=>
  • 次の数学関数 (ANSI が無効な場合はサポートされません): +、-、*、%、/
  • その他の演算子 | と ~
  • 制限付きで使用した場合の並べ替え

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

  • 結合
  • Windows 関数

データ型マッピング

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

PostgreSQL の型 Spark の型
numeric DecimalType
int2 ShortType
int4 (署名されていない場合) IntegerType
int8、oid、xid、int4 (署名されている場合) LongType
float4 FloatType
double precision、 float8 DoubleType
char CharType
name、varchar、tid VarcharType
bpchar、character varying、json、money、point、super、text StringType
bytea、geometry、varbyte BinaryType
bit、bool BooleanType
date DateType
tabstime、time、time with time zone、timetz、time without time zone、timestamp with time zone、timestamp、timestamptz、timestamp without time zone* TimestampType/TimestampNTZType
Postgresql 配列型** ArrayType

* Postgresql から読み取ると、preferTimestampNTZ = false の場合 (既定値)、Postgresql のTimestamp は Spark の TimestampType にマップされます。 Postgresql の Timestamp は、preferTimestampNTZ = true の場合、TimestampNTZType にマップされます。

**一部の配列型がサポートされています。