remote_query関数を使用して外部データベースをクエリする
プレビュー
この機能は パブリック プレビュー段階です。
remote_queryテーブル値関数 (TVF) を使用すると、リモート システムのネイティブSQL構文を使用して、 Databricks内から外部データベースやデータウェアハウスに対してSQLクエリを直接実行できます。 この関数は、クエリ フェデレーションの柔軟な代替手段を提供し、リモート データベースの方言で記述されたクエリを Databricks SQL に変換せずに実行できるようにします。
remote_queryクエリフェデレーションと比較
次の表は、 remote_query関数とクエリ フェデレーションの主な違いをまとめたものです。
属性 |
| クエリフェデレーション |
|---|---|---|
クエリ構文 | リモート データベースのネイティブ SQL 方言 (Oracle PL/SQL、BigQuery SQL など) を使用してクエリを記述します。 | Databricks SQL 構文を使用してクエリを記述します。Databricks は互換性のある操作を変換し、リモート データベースにプッシュダウンします。 |
ユースケース |
|
|
アクセス制御 | ユーザーは接続に対して | ユーザーには、フォーリンカタログ オブジェクトに対するテーブルレベルの権限が必要です。 きめ細かな制御。 |
始める前に
ワークスペースの要件:
- Unity Catalogのワークスペースが有効になっています。
コンピュートの要件:
- Databricks RuntimeクラスターまたはSQLウェアハウスからターゲットデータベースシステムへのネットワーク接続。レイクハウスフェデレーションのネットワーキングに関する推奨事項を参照してください。
- Databricks クラスターでは、Databricks Runtime 17.3 以上を使用する必要があります。
- SQLは Pro またはサーバレスであり、バージョン 2025.35 以降を使用する必要があります。
必要な権限:
- 接続を作成するには、メタストア管理者またはUnity Catalogメタストアに対する
CREATE CONNECTION権限を持つユーザーである必要があります。 remote_query関数を使用するには、接続に対するUSE CONNECTION権限、またはその関数をラップするビューに対するSELECT権限が必要です。シングルユーザー クラスターでは、接続に対するMANAGE権限も必要です。
接続を作成する
remote_query関数を使用するには、まず外部データベースへの Unity Catalog 接続を作成する必要があります。クエリ フェデレーション用の接続がすでに作成されている場合は、それを再利用できます。
remote_query関数は、次の接続タイプへの接続をサポートします。
既存の接続の管理については、 「レイクハウスフェデレーションの接続の管理」を参照してください。
接続アクセスを許可する
remote_query関数を使用するには、接続に対するUSE CONNECTION権限 (またはシングルユーザー クラスターに対するMANAGE権限) が必要です。
GRANT USE CONNECTION ON CONNECTION <connection-name> TO <user-or-group>;
remote_query関数を使用する
remote_query関数は、リモート データベースに対してクエリを実行し、結果を Databricks SQL クエリで使用できるテーブルとして返します。
構文
SELECT * FROM remote_query(
'<connection-name>',
<option-key> => '<option-value>'
[, <option-key> => '<option-value>' ...]
)
必須
connection-name: 使用するUnity Catalog接続の名前。
その他に必要なすべての事項は、接続タイプによって異なります。 詳細については、コネクタ固有のオプションを参照してください。
コネクタ固有のオプション
利用可能なオプションは接続タイプによって異なります。次の表では、各コネクタのオプションについて説明します。
MySQL、PostgreSQL、SQL Server、Redshift、Teradata
パラメーター | 必須 | 説明 |
|---|---|---|
| はい | リモート システム上のデータベース名。 |
| はい(または | リモート データベースで実行する SQL クエリ文字列。 |
| はい(または | クエリするテーブル名。 |
| No | ラウンドトリップごとに取得する行数。値を大きくするとパフォーマンスは向上しますが、メモリの使用量も多くなります。大丈夫: 0 (ドライバーを使用してください)。 |
| No | 並列データフェッチに使用する均一に分散された値を持つ列。 |
| No | パーティション列の最小値。 |
| No | パーティション列の最大値。 |
| No | データの取得に使用する並列接続の数。あまり高く(数百)設定しないでください。 |
パーティション問題を使用する場合は、4 つすべて ( partitionColumn 、 lowerBound 、 upperBound 、 numPartitions ) を一緒に指定する必要があり、 queryの代わりにdbtableオプションを使用する必要があります。
オラクル
パラメーター | 必須 | 説明 |
|---|---|---|
| はい | Oracle サービス名 ( |
| はい(または | リモート データベースで実行する SQL クエリ文字列。 |
| はい(または | クエリするテーブル名。 |
| No | ラウンドトリップごとに取得する行数。値を大きくするとパフォーマンスは向上しますが、メモリの使用量も多くなります。大丈夫: 0 (ドライバーを使用してください)。 |
| No | 並列データフェッチに使用する均一に分散された値を持つ列。 |
| No | パーティション列の最小値。 |
| No | パーティション列の最大値。 |
| No | データの取得に使用する並列接続の数。あまり高く(数百)設定しないでください。 |
パーティション問題を使用する場合は、4 つすべて ( partitionColumn 、 lowerBound 、 upperBound 、 numPartitions ) を一緒に指定する必要があり、 queryの代わりにdbtableオプションを使用する必要があります。
Snowflake
パラメーター | 必須 | 説明 |
|---|---|---|
| はい | Snowflake 内のデータベース名。 |
| はい(または | リモート データベースで実行する SQL クエリ文字列。 |
| はい(または | クエリするテーブル名 (単一部分の名前または複数部分の名前)。 |
| No | Snowflake のスキーマ名。デフォルト: |
| No | クエリのタイムアウト(秒単位)。デフォルト: 0 (タイムアウトなし)。 |
| No | 並列データ取得の予想されるパーティション サイズ (メガバイト単位)。デフォルト: 100 MB。 |
BigQuery
パラメーター | 必須 | 説明 |
|---|---|---|
| はい(または | リモート データベースで実行する SQL クエリ文字列。 |
| はい(または | クエリするテーブル名。 |
| 結果の具体化が必要な場合は、はい。 | 一時テーブルがマテリアライズされる BigQuery データセット名。一時テーブルのデフォルトの有効期間 (TTL) は 24 時間です。 |
| No | マテリアライズ化のための BigQuery プロジェクト ID。デフォルトでは、接続で指定されたプロジェクトになります。 |
| No | クエリのマテリアライゼーションを有効にするかどうか。ビューを照会するには |
| No | 課金目的の親プロジェクト ID。 |
すべてのBigQueryでは大文字と小文字が区別されます。
追加のプッシュダウンコントロールオプション
remote_query関数を Databricks SQL 操作と組み合わせることができ、それらの操作のほとんどはプッシュダウンすることもできます。また、プッシュダウンできる Databricks SQL 操作を制御することもできます。これらのオプションはすべての接続タイプに適用され、大文字と小文字は区別されません。
パラメーター | デフォルト | 説明 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
| 集計関数 ( |
|
| 上位 N クエリ ( |
デフォルトでは、すべてのプッシュダウンが有効になっています。トラブルシューティングや特定のリモート データベースとの互換性の問題を回避するために必要な場合は、特定のプッシュダウンを無効にすることができます。
ビューを通じてアクセスを委任する
ビューでremote_query関数をラップすることで、ユーザーに直接USE CONNECTION権限を付与せずに、リモート データへのアクセスを委任できます。このアプローチには次の利点があります。
- 簡素化されたアクセス制御 :
USE CONNECTION権限を管理する代わりに、ビューに対するSELECT権限を付与します。 - データ セキュリティ : ビュー クエリを定義して、ユーザーがアクセスできる列と行を制御します。
- リネージの追跡 : 直接的な接続の使用ではなく、ビュー リネージを通じてデータ アクセスを追跡します。
ビューを通じてアクセスを委任するには:
-
remote_query関数を呼び出すビューを作成します。SQLCREATE VIEW sales_data_view AS
SELECT * FROM remote_query(
'my_connection',
database => 'sales_db',
query => 'SELECT region, product, revenue FROM sales'
); -
ビューに対する
SELECT権限をユーザーまたはグループに付与します:SQLGRANT SELECT ON VIEW sales_data_view TO <user-or-group>; -
ユーザーは、
USE CONNECTION権限を必要とせずにビューをクエリできるようになりました。SQLSELECT * FROM sales_data_view WHERE region = 'US';
ビューの所有者は接続に対してUSE CONNECTION権限を持っている必要があります。ユーザーがビューをクエリする場合、クエリを実行したユーザーの権限ではなく、ビューの所有者の権限を使用して接続アクセス チェックが実行されます。
例
基本的なクエリ実行
PostgreSQL データベースでクエリを実行します。
SELECT * FROM remote_query(
'my_postgres_connection',
database => 'sales_db',
query => 'SELECT * FROM orders WHERE order_date > CURRENT_DATE - INTERVAL \'30 days\''
);
特定のテーブルをクエリする
MySQL テーブルを直接クエリします。
SELECT * FROM remote_query(
'my_mysql_connection',
database => 'inventory',
dbtable => 'my_schema.products'
);
サービス名付きOracle
Oracle データベースをクエリします。
SELECT * FROM remote_query(
'my_oracle_connection',
serviceName => 'ORCL',
query => 'SELECT * FROM customers WHERE ROWNUM <= 1000'
);
BigQueryクエリ
Google BigQuery にクエリを実行します。
SELECT * FROM remote_query(
'my_bigquery_connection',
materializationDataset => 'analytics',
query => 'SELECT * FROM `project.dataset.table` WHERE created_date > DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)'
);
Snowflakeクエリ
クエリSnowflake :
SELECT * FROM remote_query(
'my_snowflake_connection',
database => 'ANALYTICS_DB',
query => 'SELECT * FROM SALES WHERE SALE_DATE >= DATEADD(day, -30, CURRENT_DATE())'
);
パーティショニングによるパフォーマンスチューニング
SQL Server テーブルからデータを並列に取得します。
SELECT * FROM remote_query(
'my_sqlserver_connection',
database => 'sales',
dbtable => 'transactions',
partitionColumn => 'transaction_id',
lowerBound => '0',
upperBound => '1000000',
numPartitions => '10',
fetchsize => '1000'
);
Databricks SQL操作と組み合わせる
追加のフィルターと変換を適用します。
SELECT customer_id, SUM(amount) as total_amount
FROM remote_query(
'my_postgres_connection',
database => 'orders_db',
query => 'SELECT customer_id, amount, order_date FROM orders'
)
WHERE order_date >= '2025-01-01'
GROUP BY customer_id
HAVING total_amount > 1000
ORDER BY total_amount DESC
LIMIT 100;
委任アクセス用のビューを作成する
remote_query関数をラップするビューを作成します。ビューに対するSELECT権限を持つユーザーは、基礎となる接続に対するUSE CONNECTION権限を必要とせずにデータをクエリできます。
CREATE VIEW sales_summary AS
SELECT * FROM remote_query(
'my_mysql_connection',
database => 'sales',
query => 'SELECT region, product, SUM(revenue) as total_revenue FROM sales_data GROUP BY region, product'
);
GRANT SELECT ON VIEW sales_summary TO <user-or-group>;
プッシュダウン動作を制御する
remote_query関数を使用すると、Databricks は指定したクエリを超えて、リモート データベースに追加の操作をプッシュダウンできます。この機能は、 remote_query関数を使用するビューをクエリするときに役立ちます。
以下の操作をプッシュダウンできます。
- フィルター : リモート クエリの結果に適用される
WHERE句 - 投影 : 列の選択 (
SELECT個の特定の列) - 制限 : 返される行の数を制限する
LIMIT句 - オフセット : 行をスキップする
OFFSET節 - 集計 :
COUNT、SUM、AVG、MAXなどの集計関数MIN - Top-N : 上位/下位Nクエリの
ORDER BYとLIMITの組み合わせ
プッシュダウンのサポートはデータ ソースによって異なります。 詳細については、特定の接続タイプのドキュメントを参照してください。
トラブルシューティングや互換性のために特定のプッシュダウンを無効にします。
SELECT * FROM remote_query(
'my_postgres_connection',
database => 'analytics',
query => 'SELECT * FROM complex_view',
`pushdown.aggregates.enabled` => 'false',
`pushdown.filters.enabled` => 'false'
);
制限事項
-
読み取り専用操作 :
remote_query関数はSELECTクエリのみをサポートします。データ変更操作 (INSERT、UPDATE、DELETE、MERGE)、DDL 操作 (CREATE、DROP、ALTER)、およびストアド プロシージャはサポートされていません。 -
クエリの検証 : 指定したクエリはリモート データベースで直接実行されます。Databricks は、スキーマ検査を実行してクエリが読み取り専用であることを検証しますが、構文とセマンティックの検証はリモート データベースによって実行されます。
トラブルシューティング
権限エラー
権限エラーが発生した場合は、次の点を確認してください。
- 接続に対する
USE CONNECTION権限、または関数をラップするビューに対するSELECT権限があります。 - 接続の資格情報には、リモート データベースに対する適切な権限があります。
エラー例:
PERMISSION_DENIED: User does not have USE CONNECTION on Connection 'my_connection'
解決:
GRANT USE CONNECTION ON CONNECTION my_connection TO <user-or-group>;
サポートされていない
サポートされていないというエラーが表示された場合は、接続の種類に応じて正しい接続を使用していることを確認してください。 エラー メッセージには、許可されている問題がリストされます。
エラー例:
REMOTE_QUERY_FUNCTION_UNSUPPORTED_CONNECTOR_PARAMETERS: The following parameters are not supported for connection type 'postgresql': 'materializationDataset'. Allowed parameters for this connection type are: 'database', 'query', 'dbtable', 'fetchsize', 'partitionColumn', 'lowerBound', 'upperBound', 'numPartitions'.
解決策: サポートされていない問題を削除し、接続の種類に適した正しい問題を使用してください。
DML操作はサポートされていません
remote_query関数は読み取り専用のSELECTクエリのみをサポートします。
エラー例:
DML_OPERATIONS_NOT_SUPPORTED_FOR_REMOTE_QUERY_FUNCTION: Data modification operations are not supported in remote_query function.
解決策: クエリから INSERT、UPDATE、DELETE、または DDL ステートメントを削除します。SELECT ステートメントのみを使用します。