Freigeben über


Abfragen externer Datenbanken mithilfe der remote_query Funktion

Von Bedeutung

Dieses Feature befindet sich in der Public Preview.

Die remote_query Tabellenwertfunktion (TVF) ermöglicht ihnen das direkte Ausführen von SQL-Abfragen für externe Datenbanken und Data Warehouses aus Azure Databricks mithilfe der nativen SQL-Syntax des Remotesystems. Diese Funktion bietet eine flexible Alternative zum Abfrageverbund, sodass Sie Abfragen ausführen können, die im Dialekt der Remotedatenbank geschrieben wurden, ohne sie in Databricks SQL übersetzen zu müssen.

remote_query im Vergleich zum Abfrageverbund

In der folgenden Tabelle sind die wichtigsten Unterschiede zwischen der Funktion und dem remote_query Abfrageverbund zusammengefasst:

Merkmal remote_query-Funktion Abfrageverbund
Abfragesyntax Schreiben von Abfragen unter Verwendung des nativen SQL-Dialekts der Remotedatenbank (z. B. Oracle PL/SQL, BigQuery SQL). Schreiben von Abfragen mithilfe der SQL-Syntax von Databricks. Databricks übersetzt und überträgt kompatible Vorgänge an die Remotedatenbank.
Anwendungsfall
  • Sie haben bereits SQL-Abfragen im Dialekt der Remotedatenbank geschrieben, die Sie ohne Änderung ausführen möchten.
  • Sie müssen datenbankspezifische Funktionen oder Syntax verwenden, die in Databricks SQL möglicherweise nicht verfügbar sind.
  • Sie möchten Ad-hoc-Zugriff auf Remotedaten, ohne fremde Kataloge zu erstellen.
  • Sie möchten externe Daten mithilfe von Databricks SQL-Syntax abfragen.
  • Sie benötigen ein langfristiges Datenzugriffsmuster mit geregeltem Zugriff über Fremdkataloge des Unity-Katalogs.
  • Sie möchten Daten aus mehreren Quellen in einer einzigen Abfrage mithilfe einer konsistenten Syntax kombinieren.
  • Sie möchten den Genie-Assistenten zum Schreiben von Abfragen verwenden.
Zugriffskontrolle Benutzer benötigen USE CONNECTION Berechtigungen für die Verbindung. Die Berechtigung kann über Ansichten delegiert werden. Benutzer benötigen Berechtigungen auf Tabellenebene für fremde Katalogobjekte. Fein abgestimmte Kontrolle.

Bevor Sie anfangen

Anforderungen an den Arbeitsbereich:

  • Der Arbeitsbereich muss für Unity Catalog aktiviert sein.

Computeanforderungen:

  • Netzwerkkonnektivität zwischen Ihrem Databricks Runtime-Cluster oder SQL-Warehouse und den Zieldatenbanksystemen. Weitere Informationen finden Sie unter Netzwerkempfehlungen für Lakehouse Federation.
  • Azure Databricks-Cluster müssen Databricks Runtime 17.3 oder höher verwenden.
  • SQL Warehouses müssen Pro oder Serverless sein und Version 2025.35 oder höher verwenden.

Erforderliche Berechtigungen:

  • Um eine Verbindung zu erstellen, müssen Sie über die Berechtigung für den CREATE CONNECTION Unity-Katalog-Metastore verfügen.
  • Um die remote_query Funktion zu verwenden, müssen Sie über die USE CONNECTION Berechtigung für die Verbindung oder die SELECT Berechtigungen für eine Ansicht verfügen, die die Funktion umschließt. Einzelbenutzercluster erfordern auch die MANAGE Berechtigung für die Verbindung.

Verbindung erstellen

Um die remote_query Funktion zu verwenden, müssen Sie zuerst eine Unity-Katalogverbindung mit Ihrer externen Datenbank erstellen. Wenn Sie bereits eine Verbindung für den Abfrageverbund erstellt haben, können Sie sie wiederverwenden.

Die remote_query Funktion unterstützt Verbindungen mit den folgenden Verbindungstypen:

Informationen zum Verwalten vorhandener Verbindungen finden Sie unter Verwalten von Verbindungen für Lakehouse Federation.

Gewähren des Verbindungszugriffs

Um die remote_query Funktion zu verwenden, müssen Sie über die USE CONNECTION Berechtigung für die Verbindung verfügen (oder über die MANAGE Berechtigungen für Einzelbenutzercluster).

GRANT USE CONNECTION ON CONNECTION <connection-name> TO <user-or-group>;

Verwenden der remote_query Funktion

Die remote_query Funktion führt eine Abfrage für die Remotedatenbank aus und gibt die Ergebnisse als Tabelle zurück, die Sie in Sql-Abfragen von Databricks verwenden können.

Syntax

SELECT * FROM remote_query(
  '<connection-name>',
  <option-key> => '<option-value>'
  [, <option-key> => '<option-value>' ...]
)

Erforderliche Parameter

  • connection-name: Der Name der zu verwendenden Unity-Katalogverbindung.

Alle anderen erforderlichen Parameter variieren je nach Verbindungstyp. Details finden Sie unter Connectorspezifische Optionen .

Connectorspezifische Optionen

Die verfügbaren Optionen variieren je nach Verbindungstyp. In den folgenden Tabellen werden die Optionen für jeden Verbinder beschrieben.

MySQL, PostgreSQL, SQL Server, Redshift und Teradata

Parameter Erforderlich Description
database Yes Der Datenbankname im Remotesystem.
query Ja (oder dbtable) Eine SQL-Abfragezeichenfolge, die für die Remotedatenbank ausgeführt werden soll. Kann nicht mit dbtable verwendet werden.
dbtable Ja (oder query) Der zu abfragende Tabellenname. Kann nicht mit query verwendet werden.
fetchsize Nein Die Anzahl der Zeilen, die pro Roundtrip abgerufen werden sollen. Größere Werte können die Leistung verbessern, aber mehr Arbeitsspeicher verwenden. Standard: 0 (Treiberstandard verwenden).
partitionColumn Nein Eine Spalte mit einheitlich verteilten Werten, die zum Abrufen paralleler Daten verwendet werden sollen. Muss mit lowerBound, upperBound und numPartitions verwendet werden. Kann nicht mit der query Option verwendet werden.
lowerBound Nein Der Mindestwert der Partitionsspalte. Muss mit partitionColumn, upperBound und numPartitions verwendet werden.
upperBound Nein Der Maximalwert der Partitionsspalte. Muss mit partitionColumn, lowerBound und numPartitions verwendet werden.
numPartitions Nein Die Anzahl der parallelen Verbindungen, die zum Abrufen von Daten verwendet werden sollen. Legen Sie dies nicht zu hoch (Hunderte) fest. Muss mit partitionColumn, lowerBound und upperBound verwendet werden.

Hinweis

Wenn Sie Partitionsparameter verwenden, müssen alle vier Parameter (partitionColumn, lowerBound, upperBound, numPartitions) zusammen angegeben werden, und Sie müssen die dbtable-Option anstelle der query-Option verwenden.

Oracle

Parameter Erforderlich Description
service_name Yes Der Oracle-Dienstname (anstelle von database).
query Ja (oder dbtable) Eine SQL-Abfragezeichenfolge, die für die Remotedatenbank ausgeführt werden soll. Kann nicht mit dbtable verwendet werden.
dbtable Ja (oder query) Der zu abfragende Tabellenname. Kann nicht mit query verwendet werden.
fetchsize Nein Die Anzahl der Zeilen, die pro Roundtrip abgerufen werden sollen. Größere Werte können die Leistung verbessern, aber mehr Arbeitsspeicher verwenden. Standard: 0 (Treiberstandard verwenden).
partitionColumn Nein Eine Spalte mit einheitlich verteilten Werten, die zum Abrufen paralleler Daten verwendet werden sollen. Muss mit lowerBound, upperBound und numPartitions verwendet werden. Kann nicht mit der query Option verwendet werden.
lowerBound Nein Der Mindestwert der Partitionsspalte. Muss mit partitionColumn, upperBound und numPartitions verwendet werden.
upperBound Nein Der Maximalwert der Partitionsspalte. Muss mit partitionColumn, lowerBound und numPartitions verwendet werden.
numPartitions Nein Die Anzahl der parallelen Verbindungen, die zum Abrufen von Daten verwendet werden sollen. Legen Sie dies nicht zu hoch (Hunderte) fest. Muss mit partitionColumn, lowerBound und upperBound verwendet werden.

Hinweis

Wenn Sie Partitionsparameter verwenden, müssen alle vier Parameter (partitionColumn, lowerBound, upperBound, numPartitions) zusammen angegeben werden, und Sie müssen die dbtable-Option anstelle der query-Option verwenden.

Schneeflocke

Parameter Erforderlich Description
database Yes Der Datenbankname in Snowflake.
query Ja (oder dbtable) Eine SQL-Abfragezeichenfolge, die für die Remotedatenbank ausgeführt werden soll. Kann nicht mit dbtable verwendet werden.
dbtable Ja (oder query) Der Tabellenname für die Abfrage (Einzelteilname oder mehrteiliger Name). Kann nicht mit query verwendet werden.
schema Nein Der Schemaname in Snowflake. Standardwert: public.
query_timeout Nein Das Abfrage-Timeout in Sekunden. Standard: 0 (kein Timeout).
partition_size_in_mb Nein Die erwartete Partitionsgröße in Megabyte für parallele Datenabrufe. Standard: 100 MB.

BigQuery

Parameter Erforderlich Description
query Ja (oder dbtable) Eine SQL-Abfragezeichenfolge, die für die Remotedatenbank ausgeführt werden soll. Kann nicht mit dbtable verwendet werden.
dbtable Ja (oder query) Der zu abfragende Tabellenname. Kann nicht mit query verwendet werden.
materializationDataset Ja, wenn die Materialisierung der Ergebnisse erforderlich ist. Materialisierung ist erforderlich, wenn query angegeben ist und dbtable auf eine Ansicht verweist. Der Name des BigQuery-Datasets, in dem temporäre Tabellen materialisiert werden. Die Standard-Lebensdauer (TTL) temporärer Tabellen beträgt 24 Stunden.
materializationProject Nein Die BigQuery-Projekt-ID für die Materialisierung. Standardmäßig wird das in der Verbindung angegebene Projekt verwendet.
materializationEnabled Nein Gibt an, ob die Materialisierung für Abfragen aktiviert werden soll. Auf true setzen, um Abfrageansichten zu erstellen. Standard: false wenn dbtable angegeben, true falls query angegeben.
parentProject Nein Die übergeordnete Projekt-ID für Abrechnungszwecke.

Von Bedeutung

Bei allen BigQuery-Parametern wird die Groß-/Kleinschreibung beachtet.

Zusätzliche Pushdown-Steuerungsoptionen

Sie können die remote_query-Funktion mit SQL-Vorgängen von Databricks kombinieren, und die meisten dieser Vorgänge können ebenfalls optimiert werden. Sie können auch steuern, welche "Databricks SQL"-Vorgänge heruntergeschoben werden können. Diese Optionen gelten für alle Verbindungstypen und beachten die Groß-/Kleinschreibung.

Parameter Standard Description
pushdown.limit.enabled true Aktivieren oder Deaktivieren von Pushdownklauseln LIMIT an die Remotedatenbank.
pushdown.offset.enabled true Aktivieren oder Deaktivieren von Pushdownklauseln OFFSET an die Remotedatenbank.
pushdown.filters.enabled true Aktivieren oder deaktivieren, dass WHERE-Filter zur Remotedatenbank übertragen werden.
pushdown.aggregates.enabled true Aktivieren oder Deaktivieren der Pushdown-Aggregatfunktionen (COUNT, SUM, AVG, MAX, MIN) an die Remotedatenbank.
pushdown.sortLimit.enabled true Aktivieren oder deaktivieren Sie das Durchreichen von Top-N-Abfragen (Kombination von ORDER BY und LIMIT) an die Remotedatenbank.

Standardmäßig sind alle Pushdowns aktiviert. Sie können bestimmte Pushdowns deaktivieren, wenn sie für die Problembehandlung erforderlich sind, oder um Kompatibilitätsprobleme mit bestimmten Remotedatenbanken zu umgehen.

Stellvertretungszugriff mittels Ansichten

Sie können den Zugriff auf Remotedaten delegieren, ohne Benutzern direkte USE CONNECTION Berechtigungen zu gewähren, indem Sie die remote_query Funktion in eine Ansicht umschließen. Dieser Ansatz hat die folgenden Vorteile:

  • Vereinfachte Zugriffssteuerung: Gewähren Sie SELECT Berechtigungen für die Ansicht, anstatt USE CONNECTION Berechtigungen zu verwalten.
  • Datensicherheit: Steuern Sie, auf welche Spalten und Zeilen Benutzer zugreifen können, indem Sie die Ansichtsabfrage definieren.
  • Nachverfolgen von Linien: Nachverfolgen des Datenzugriffs durch Ansichtslinien anstelle der direkten Verbindungsnutzung.

So delegieren Sie den Zugriff über eine Ansicht:

  1. Erstellen Sie eine Ansicht, die die remote_query Funktion aufruft:

    CREATE VIEW sales_data_view AS
    SELECT * FROM remote_query(
      'my_connection',
      database => 'sales_db',
      query => 'SELECT region, product, revenue FROM sales'
    );
    
  2. Gewähren Sie SELECT der Ansicht Berechtigungen für Benutzer oder Gruppen:

    GRANT SELECT ON VIEW sales_data_view TO <user-or-group>;
    
  3. Benutzer können jetzt die Ansicht abfragen, ohne die USE CONNECTION Berechtigung zu benötigen:

    SELECT * FROM sales_data_view WHERE region = 'US';
    

Von Bedeutung

Der Ansichtsbesitzer muss über USE CONNECTION Berechtigung für die Verbindung verfügen. Wenn Benutzer die Ansicht abfragen, wird die Verbindungszugriffsprüfung mit den Berechtigungen des Ansichtsbesitzers und nicht mit den Berechtigungen des Abfragebenutzers ausgeführt.

Examples

Grundlegende Abfrageausführung

Ausführen einer Abfrage für eine PostgreSQL-Datenbank:

SELECT * FROM remote_query(
  'my_postgres_connection',
  database => 'sales_db',
  query => 'SELECT * FROM orders WHERE order_date > CURRENT_DATE - INTERVAL \'30 days\''
);

Abfragen einer bestimmten Tabelle

Abfragen einer MySQL-Tabelle direkt:

SELECT * FROM remote_query(
  'my_mysql_connection',
  database => 'inventory',
  dbtable => 'my_schema.products'
);

Oracle mit Dienstname

Abfragen einer Oracle-Datenbank:

SELECT * FROM remote_query(
  'my_oracle_connection',
  service_name => 'ORCL',
  query => 'SELECT * FROM customers WHERE ROWNUM <= 1000'
);

BigQuery-Abfrage

Abfrage 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-Abfrage

Abfrage an Snowflake:

SELECT * FROM remote_query(
  'my_snowflake_connection',
  database => 'ANALYTICS_DB',
  query => 'SELECT * FROM SALES WHERE SALE_DATE >= DATEADD(day, -30, CURRENT_DATE())'
);

Leistungsoptimierung mit Partitionierung

Daten parallel aus einer SQL Server-Tabelle abrufen:

SELECT * FROM remote_query(
  'my_sqlserver_connection',
  database => 'sales',
  dbtable => 'transactions',
  partitionColumn => 'transaction_id',
  lowerBound => '0',
  upperBound => '1000000',
  numPartitions => '10',
  fetchsize => '1000'
);

Kombinieren mit Sql-Vorgängen in Databricks

Anwenden zusätzlicher Filter und Transformationen:

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;

Erstellen einer Ansicht für delegierten Zugriff

Erstellen Sie eine Ansicht, die die remote_query Funktion umschließt. Benutzer mit SELECT Berechtigung für die Ansicht können die Daten abfragen, ohne Berechtigung für die zugrunde liegende Verbindung zu benötigen 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>;

Steuern des Pushdownverhaltens

Wenn Sie die remote_query Funktion verwenden, können Databricks zusätzliche Vorgänge über die angegebene Abfrage hinaus in die Remotedatenbank übertragen. Dieses Feature ist nützlich, wenn Sie eine Ansicht abfragen, die die remote_query Funktion verwendet.

Die folgenden Vorgänge können nach unten verschoben werden:

  • Filter: WHERE Klauseln, die auf das Ergebnis der Remoteabfrage angewendet werden
  • Projektionen: Spaltenauswahl (SELECT bestimmte Spalten)
  • Limit: LIMIT Klauseln zum Einschränken der Anzahl der zurückgegebenen Zeilen
  • Offset: OFFSET Klauseln zum Überspringen von Zeilen
  • Aggregate: Aggregationsfunktionen wie COUNT, SUM, AVG, MAX, MIN
  • Top-N: Kombination von ORDER BY und LIMIT für top/bottom N-Abfragen

Die Pushdownunterstützung variiert je nach Datenquelle. Ausführliche Informationen finden Sie in der Dokumentation zu Ihrem spezifischen Verbindungstyp.

Deaktivieren Sie bestimmte Pushdowns zur Problemlösung oder zur Sicherstellung der Kompatibilität:

SELECT * FROM remote_query(
  'my_postgres_connection',
  database => 'analytics',
  query => 'SELECT * FROM complex_view',
  `pushdown.aggregates.enabled` => 'false',
  `pushdown.filters.enabled` => 'false'
);

Einschränkungen

  • Schreibgeschützte Vorgänge: Die remote_query Funktion unterstützt nur SELECT Abfragen. Datenänderungsvorgänge (INSERT, UPDATEDELETE, MERGE), DDL-Vorgänge (CREATE, DROP, ALTER) und gespeicherte Prozeduren werden nicht unterstützt.

  • Abfrageüberprüfung: Die von Ihnen bereitgestellte Abfrage wird direkt in der Remotedatenbank ausgeführt. Databricks überprüft mittels einer Schemaüberprüfung, ob die Abfrage schreibgeschützt ist (read-only), während jedoch die Syntax- und Semantikvalidierung von der Remotedatenbank durchgeführt wird.

Problembehandlung

Berechtigungsfehler

Wenn Sie einen Berechtigungsfehler erhalten, überprüfen Sie Folgendes:

  1. Sie verfügen über die USE CONNECTION Berechtigung für die Verbindung oder die SELECT Berechtigung für eine Ansicht, die die Funktion umschließt.
  2. Die Anmeldedaten der Verbindung haben die erforderlichen Berechtigungen für die Remotedatenbank.

Beispielfehler:

PERMISSION_DENIED: User does not have USE CONNECTION on Connection 'my_connection'

Lösung:

GRANT USE CONNECTION ON CONNECTION my_connection TO <user-or-group>;

Nicht unterstützte Parameter

Wenn Sie eine Fehlermeldung zu nicht unterstützten Parametern erhalten, überprüfen Sie, ob Sie die richtigen Parameter für den Verbindungstyp verwenden. Die Fehlermeldung listet die zulässigen Parameter auf.

Beispielfehler:

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'.

Lösung: Entfernen Sie den nicht unterstützten Parameter, und verwenden Sie die richtigen Parameter für den Verbindungstyp.

DML-Vorgänge werden nicht unterstützt

Die Funktion remote_query unterstützt nur Lese- SELECT Abfragen.

Beispielfehler:

DML_OPERATIONS_NOT_SUPPORTED_FOR_REMOTE_QUERY_FUNCTION: Data modification operations are not supported in remote_query function.

Lösung: Entfernen Sie beliebige INSERT, UPDATEDELETE- oder DDL-Anweisungen aus Ihrer Abfrage. Verwenden Sie nur SELECT-Anweisungen.

Weitere Ressourcen