Interroger des bases de données externes à l'aide de la fonction remote_query
Aperçu
Cette fonctionnalité est en aperçu public.
La fonction à valeur de table (TVF) remote_query vous permet d'exécuter des query SQL directement sur des bases de données externes et des data warehouses depuis Databricks, en utilisant la syntaxe SQL native du système distant. Cette fonction offre une alternative flexible à la fédération de query, vous permettant d'exécuter des query écrites dans le dialecte de la base de données distante sans avoir besoin de les traduire en Databricks SQL.
remote_query comparé à la fédération de query
Le tableau suivant résume les principales différences entre la fonction remote_query et la fédération de query :
Attribut |
| Query federation |
|---|---|---|
Syntaxe de query | Rédigez des requêtes en utilisant le dialecte SQL natif de la base de données distante (par exemple, Oracle PL/SQL, BigQuery SQL). | Écrivez des requêtes en utilisant la syntaxe Databricks SQL. Databricks traduit et répercute les opérations compatibles vers la base de données distante. |
Cas d'usage |
|
|
Contrôle d'accès | Les utilisateurs ont besoin du privilège | Les utilisateurs ont besoin de privilèges au niveau de la table sur les objets de catalogue étranger. Contrôle granulaire. |
Avant de commencer
Exigences du Workspace :
- Workspace activé pour Unity Catalog.
Compute requis :
- Connectivité réseau de votre cluster Databricks Runtime ou de votre SQL Warehouse aux systèmes de base de données cibles. Consultez les recommandations de mise en réseau pour Lakehouse Federation.
- Les clusters Databricks doivent utiliser Databricks Runtime 17.3 ou une version ultérieure.
- Les SQL warehouses doivent être Pro ou Serverless et utiliser la version 2025.35 ou ultérieure.
Autorisations requises :
- Pour créer une connexion, vous devez avoir le privilège
CREATE CONNECTIONsur le métastore Unity Catalog. - Pour utiliser la fonction
remote_query, vous devez disposer du privilègeUSE CONNECTIONsur la connexion ou du privilègeSELECTsur une vue qui encapsule la fonction. Les clusters à utilisateur unique nécessitent également l'autorisationMANAGEsur la connexion.
Créer une connexion
Pour utiliser la fonction remote_query, vous devez d’abord créer une connexion Unity Catalog à votre base de données externe. Si vous disposez déjà d'une connexion créée pour la fédération de query, vous pouvez la réutiliser.
La fonction remote_query prend en charge les connexions aux types de connexion suivants :
- MySQL
- PostgreSQL
- Teradata
- Oracle
- Amazon Redshift
- Snowflake
- Microsoft SQL Server
- Google BigQuery
- JDBC
Pour des informations sur la gestion des connexions existantes, consultez Gérer les connexions pour Lakehouse Federation.
Accorder l'accès à la connexion
Pour utiliser la fonction remote_query, vous devez disposer du privilège USE CONNECTION sur la connexion (ou du privilège MANAGE sur les clusters à utilisateur unique).
GRANT USE CONNECTION ON CONNECTION <connection-name> TO <user-or-group>;
Utilisez la fonction remote_query
La fonction remote_query exécute une requête sur la base de données distante et renvoie les résultats sous forme de table que vous pouvez utiliser dans les requêtes Databricks SQL.
Syntaxe
SELECT * FROM remote_query(
'<connection-name>',
<option-key> => '<option-value>'
[, <option-key> => '<option-value>' ...]
)
Paramètres requis
connection-name: Le nom de la connexion Unity Catalog à utiliser.
Tous les autres paramètres requis varient selon le type de connexion. Consultez les options spécifiques au connecteur pour plus de détails.
Options spécifiques au connecteur
Les options disponibles varient selon le type de connexion. Les tableaux suivants décrivent les options de chaque connecteur.
MySQL, PostgreSQL, SQL Server, Redshift et Teradata
parameter | Obligatoire | Description |
|---|---|---|
| Oui | Le nom de la base de données sur le système distant. |
| Oui (ou | Une chaîne de query SQL à exécuter sur la base de données distante. Ne peut pas être utilisé avec |
| Oui (ou | Le nom de la table à interroger. Ne peut pas être utilisé avec |
| Non | Le nombre de lignes à récupérer par aller-retour. Des valeurs plus importantes peuvent améliorer les performances, mais elles utilisent plus de mémoire. Par default : 0 (utiliser la valeur par default du driver). |
| Non | Une colonne avec des valeurs uniformément réparties à utiliser pour la récupération parallèle des données. Doit être utilisé avec |
| Non | La valeur minimale de la colonne de partition. Doit être utilisé avec |
| Non | La valeur maximale de la colonne de partition. Doit être utilisé avec |
| Non | Le nombre de connexions parallèles à utiliser pour la récupération des données. Ne définissez pas cette valeur trop haut (des centaines). Doit être utilisé avec |
Lorsque vous utilisez des paramètres de partition, les quatre paramètres (partitionColumn, lowerBound, upperBound, numPartitions) doivent être spécifiés ensemble, et vous devez utiliser l'option dbtable au lieu de query.
Oracle
parameter | Obligatoire | Description |
|---|---|---|
| Oui | Le nom du service Oracle (utilisé à la place de |
| Oui (ou | Une chaîne de query SQL à exécuter sur la base de données distante. Ne peut pas être utilisé avec |
| Oui (ou | Le nom de la table à interroger. Ne peut pas être utilisé avec |
| Non | Le nombre de lignes à récupérer par aller-retour. Des valeurs plus importantes peuvent améliorer les performances, mais elles utilisent plus de mémoire. Par default : 0 (utiliser la valeur par default du driver). |
| Non | Une colonne avec des valeurs uniformément réparties à utiliser pour la récupération parallèle des données. Doit être utilisé avec |
| Non | La valeur minimale de la colonne de partition. Doit être utilisé avec |
| Non | La valeur maximale de la colonne de partition. Doit être utilisé avec |
| Non | Le nombre de connexions parallèles à utiliser pour la récupération des données. Ne définissez pas cette valeur trop haut (des centaines). Doit être utilisé avec |
Lorsque vous utilisez des paramètres de partition, les quatre paramètres (partitionColumn, lowerBound, upperBound, numPartitions) doivent être spécifiés ensemble, et vous devez utiliser l'option dbtable au lieu de query.
Snowflake
parameter | Obligatoire | Description |
|---|---|---|
| Oui | Le nom de la base de données dans Snowflake. |
| Oui (ou | Une chaîne de query SQL à exécuter sur la base de données distante. Ne peut pas être utilisé avec |
| Oui (ou | Le nom de la table à query (nom en une partie ou en plusieurs parties). Ne peut pas être utilisé avec |
| Non | Le nom du schéma dans Snowflake. Default : |
| Non | Le délai d'expiration de la query en secondes. Default: 0 (aucun délai d'expiration). |
| Non | La taille de partition attendue en mégaoctets pour la récupération parallèle des données. default: 100 Mo. |
BigQuery
parameter | Obligatoire | Description |
|---|---|---|
| Oui (ou | Une chaîne de query SQL à exécuter sur la base de données distante. Ne peut pas être utilisé avec |
| Oui (ou | Le nom de la table à interroger. Ne peut pas être utilisé avec |
| Oui, si la matérialisation des résultats est nécessaire. La matérialisation est nécessaire si | Le nom du dataset BigQuery où les tables temporaires sont matérialisées. La durée de vie (TTL) default des tables temporaires est de 24 heures. |
| Non | L'ID du projet BigQuery pour la matérialisation. Default to the project specified in the connection. |
| Non | Faut-il activer la matérialisation pour les query. Définissez sur |
| Non | L'ID du projet parent à des fins de facturation. |
Tous les paramètres BigQuery sont sensibles à la casse.
JDBC
Les connexions JDBC sont génériques et peuvent se connecter à n'importe quelle base de données avec un Driver JDBC. Databricks recommande d'utiliser une connexion JDBC uniquement si votre base de données n'est pas prise en charge par l'un des autres types de connexion intégrés, car les types de connexion intégrés offrent de meilleures performances. Contrairement aux autres types de connexion intégrés, le type de connexion JDBC n'a pas d'ensemble intégré d'options de temps de query autorisées. Pour permettre qu'une option soit définie au moment de la requête, le propriétaire de la connexion doit l'ajouter au parameter externalOptionsAllowList sur la connexion. Si externalOptionsAllowList n'est pas défini, aucune option ne peut être transmise au moment de la query.
Les options définies sur la connexion ne peuvent pas être outrepassées au moment de la query. Les paramètres de connexion host, port, serverName, portNumber et instanceName ne peuvent jamais être définis au moment de la query, quelle que soit externalOptionsAllowList. Voir la connexion JDBC pour plus de détails.
Options de contrôle de pushdown supplémentaires
Vous pouvez combiner la fonction remote_query avec les opérations Databricks SQL, et la plupart de ces opérations peuvent également être poussées vers le bas. Vous pouvez également contrôler quelles opérations Databricks SQL peuvent être transférées. Ces options s'appliquent à tous les types de connexion et sont insensibles à la casse.
parameter | Par défaut | Description |
|---|---|---|
|
| Activez ou désactivez le pushdown des clauses |
|
| Activez ou désactivez le pushdown des clauses |
|
| Activer ou désactiver l'envoi des filtres |
|
| Activer ou désactiver le transfert des fonctions d'agrégation ( |
|
| Activer ou désactiver la descente des queries Top N (combinaison de |
Par default, toutes les opérations de pushdown sont activées. Vous pouvez désactiver des pushdowns spécifiques si nécessaire pour le dépannage ou pour contourner des problèmes de compatibilité avec des bases de données distantes spécifiques.
Déléguer l'accès via les vues
Vous pouvez déléguer l'accès aux données distantes sans accorder directement aux utilisateurs les privilèges USE CONNECTION en encapsulant la fonction remote_query dans une vue. Cette approche présente les avantages suivants :
- **Contrôle d'accès simplifié** : accordez
SELECTle privilège sur la vue au lieu de gérerUSE CONNECTIONles privilèges. - Sécurité des données : contrôlez les colonnes et les lignes auxquelles les utilisateurs peuvent accéder en définissant la query d'affichage.
- Suivi de la lignée : Suivez l’accès aux données via la lignée de la vue plutôt qu’une utilisation directe de la connexion.
Pour déléguer l'accès via une vue :
-
Créez une vue qui appelle la fonction
remote_query:SQLCREATE VIEW sales_data_view AS
SELECT * FROM remote_query(
'my_connection',
database => 'sales_db',
query => 'SELECT region, product, revenue FROM sales'
); -
Accorder le privilège
SELECTsur la vue aux utilisateurs ou groupes :SQLGRANT SELECT ON VIEW sales_data_view TO <user-or-group>; -
Les utilisateurs peuvent désormais interroger la vue sans avoir besoin du privilège
USE CONNECTION:SQLSELECT * FROM sales_data_view WHERE region = 'US';
Le propriétaire de la vue doit disposer du privilège USE CONNECTION sur la connexion. Lorsque les utilisateurs interrogent la vue, la vérification d'accès à la connexion est effectuée à l'aide des privilèges du propriétaire de la vue, et non des privilèges de l'utilisateur qui interroge.
Exemples
Exécution de base de la query
Exécutez une query sur une base de données PostgreSQL :
SELECT * FROM remote_query(
'my_postgres_connection',
database => 'sales_db',
query => 'SELECT * FROM orders WHERE order_date > CURRENT_DATE - INTERVAL \'30 days\''
);
query une table spécifique
Query une table MySQL directement :
SELECT * FROM remote_query(
'my_mysql_connection',
database => 'inventory',
dbtable => 'my_schema.products'
);
Oracle avec nom de service
Queryer une base de données Oracle :
SELECT * FROM remote_query(
'my_oracle_connection',
service_name => 'ORCL',
query => 'SELECT * FROM customers WHERE ROWNUM <= 1000'
);
BigQuery query
Query 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)'
);
Query Snowflake
Interroger Snowflake :
SELECT * FROM remote_query(
'my_snowflake_connection',
database => 'ANALYTICS_DB',
query => 'SELECT * FROM SALES WHERE SALE_DATE >= DATEADD(day, -30, CURRENT_DATE())'
);
Query JDBC
Interroger une base de données à l'aide d'une connexion JDBC :
SELECT * FROM remote_query(
'my_jdbc_connection',
query => 'SELECT * FROM customers WHERE active = 1'
);
Optimisation des performances avec le partitionnement
Récupérer les données en parallèle à partir d'une table SQL Server :
SELECT * FROM remote_query(
'my_sqlserver_connection',
database => 'sales',
dbtable => 'transactions',
partitionColumn => 'transaction_id',
lowerBound => '0',
upperBound => '1000000',
numPartitions => '10',
fetchsize => '1000'
);
Combiner avec les opérations Databricks SQL
Appliquer des filtres supplémentaires et des transformations :
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;
Créer une vue pour l'accès délégué
Créer une vue qui enveloppe la fonction remote_query. Les utilisateurs disposant du privilège SELECT sur la vue peuvent interroger les données sans avoir besoin du privilège USE CONNECTION sur la connexion sous-jacente :
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>;
Contrôler le comportement de pushdown
Lorsque vous utilisez la fonction remote_query, Databricks peut transférer des opérations supplémentaires vers la base de données distante au-delà de la query que vous spécifiez. Cette fonctionnalité est utile lorsque vous exécutez une query sur une vue qui utilise la fonction remote_query.
Les Opérations suivantes peuvent être transférées :
- Filtres :
WHEREclauses appliquées au résultat de la query distante. - Projections : sélection de colonnes (
SELECTcolonnes spécifiques) - Limite :
LIMITclauses pour restreindre le nombre de lignes renvoyées - Offset :
OFFSETclauses pour ignorer les lignes - Agrégats : Fonctions d'agrégation comme
COUNT,SUM,AVG,MAX,MIN - Top-N : Combinaison de
ORDER BYetLIMITpour les requêtes N supérieures/inférieures
La prise en charge du pushdown varie selon la source de données. Consultez la documentation relative à votre type de connexion spécifique pour plus de détails.
Désactiver les descentes de prédicats spécifiques pour le dépannage ou la compatibilité :
SELECT * FROM remote_query(
'my_postgres_connection',
database => 'analytics',
query => 'SELECT * FROM complex_view',
`pushdown.aggregates.enabled` => 'false',
`pushdown.filters.enabled` => 'false'
);
Limitations
-
Opérations en lecture seule : la fonction
remote_queryne prend en charge que les queriesSELECT. Les Opérations de modification de données (INSERT, UPDATE, DELETE, Merge), les Opérations DDL (CREATE, DROP, ALTER) et les procédures stockées ne sont pas prises en charge. -
Validation de la query : La query que vous fournissez est exécutée directement sur la base de données distante. Databricks valide que la query est en lecture seule en effectuant une inspection du schéma, mais la validation syntaxique et sémantique est effectuée par la base de données distante.
Dépannage
Erreurs d'autorisation
Si vous recevez une erreur d'autorisation, vérifiez que :
- Vous disposez du privilège
USE CONNECTIONsur la connexion ou du privilègeSELECTsur une vue qui englobe la fonction. - Les informations d'identification de la connexion disposent des autorisations appropriées sur la base de données distante.
Exemple d'erreur :
PERMISSION_DENIED: User does not have USE CONNECTION on Connection 'my_connection'
Résolution :
GRANT USE CONNECTION ON CONNECTION my_connection TO <user-or-group>;
Paramètres non pris en charge
Si vous recevez une erreur concernant des paramètres non pris en charge, vérifiez que vous utilisez les paramètres corrects pour votre type de connexion. Le message d'erreur répertorie les paramètres autorisés.
Exemple d'erreur :
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'.
Résolution : supprimez le paramètre non pris en charge et utilisez les paramètres corrects pour votre type de connexion.
Opérations DML non prises en charge
La fonction remote_query prend uniquement en charge les query SELECT en lecture seule.
Exemple d'erreur :
DML_OPERATIONS_NOT_SUPPORTED_FOR_REMOTE_QUERY_FUNCTION: Data modification operations are not supported in remote_query function.
Résolution : supprimez toutes les instructions INSERT, UPDATE, DELETE ou DDL de votre query. N'utilisez que des instructions SELECT.