Föderierte AlloyDB-Abfragen
Mit föderierten Abfragen in BigQuery können Sie Daten, die in AlloyDB for PostgreSQL gespeichert sind, in Echtzeit abfragen, ohne die Daten kopieren oder verschieben zu müssen. Mit der Funktion EXTERNAL_QUERY können Sie SQL-Abfragen an AlloyDB senden und die Ergebnisse mit Ihren BigQuery-Tabellen verknüpfen.
Hinweis
- Achten Sie darauf, dass Ihr BigQuery-Administrator eine AlloyDB-Verbindung erstellt und für Sie freigegeben hat.
-
Bitten Sie Ihren Administrator, Ihnen die IAM-Rolle BigQuery-Verbindungsnutzer (
roles/bigquery.connectionUser) in Ihrem Projekt zu gewähren, um die Berechtigungen zu erhalten, die Sie zum Abfragen einer AlloyDB-Instanz benötigen. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.
Daten abfragen
Verwenden Sie die Funktion EXTERNAL_QUERY, um eine föderierte Abfrage aus einer GoogleSQL-Abfrage an Spanner zu senden.
Angenommen Sie speichern eine Kundentabelle in BigQuery und eine Verkaufstabelle in AlloyDB und möchten die beiden Tabellen in einer einzigen Abfrage verknüpfen. Im folgenden Beispiel wird eine föderierte Abfrage an eine AlloyDB-Tabelle namens orders gesendet und die Ergebnisse mit einer BigQuery-Tabelle namens mydataset.customers verknüpft.
Die Beispielabfrage besteht aus 3 Teilen:
Die externe Abfrage
SELECT customer_id, MIN(order_date) AS first_order_date FROM orders GROUP BY customer_idwird in der AlloyDB-Datenbank ausgeführt, um das erste Bestelldatum für jeden Kunden über die FunktionEXTERNAL_QUERYabzurufen.Verknüpfen Sie die Ergebnistabelle der externen Abfrage mit der Kundentabelle in BigQuery anhand von
customer_id.Wählen Sie im endgültigen Ergebnissatz die Kundendaten und das Datum der ersten Bestellung aus.
SELECT c.customer_id, c.name, rq.first_order_date
FROM mydataset.customers AS c
LEFT OUTER JOIN EXTERNAL_QUERY(
'us.connection_id',
'''SELECT customer_id, MIN(order_date) AS first_order_date
FROM orders
GROUP BY customer_id''') AS rq ON rq.customer_id = c.customer_id
GROUP BY c.customer_id, c.name, rq.first_order_date;
AlloyDB-Tabellenschema ansehen
Mit der Funktion EXTERNAL_QUERY können Sie information_schema-Tabellen abfragen, um auf Datenbankmetadaten zuzugreifen. Sie können beispielsweise alle Tabellen in der Datenbank auflisten oder das Tabellenschema ansehen. Weitere Informationen finden Sie unter PostgreSQL-information_schema-Tabellen.
-- List all tables in a database.
SELECT * FROM EXTERNAL_QUERY("region.connection_id",
"select * from information_schema.tables;");
-- List all columns in a table.
SELECT * FROM EXTERNAL_QUERY("region.connection_id",
"select * from information_schema.columns where table_name='x';");
Föderierte BigQuery-Abfragen verfolgen
Wenn Sie eine föderierte Abfrage für AlloyDB ausführen, fügt BigQuery der Abfrage einen Kommentar wie den folgenden hinzu:
/* Federated query from BigQuery. Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID. */
Wenn Sie Logs auf die Abfragenutzung hin überwachen, kann Ihnen die folgende Annotation helfen, Abfragen zu identifizieren, die von BigQuery stammen.
Rufen Sie die Seite Log-Explorer auf.
Geben Sie auf dem Tab Abfrage die folgende Abfrage ein:
resource.type="alloydb.googleapis.com/Instance" textPayload=~"Federated query from BigQuery"Klicken Sie auf Abfrage ausführen.
Wenn Datensätze für föderierte BigQuery-Abfragen verfügbar sind, wird unter Abfrageergebnisse eine Liste mit Datensätzen angezeigt, die in etwa so aussieht:
YYYY-MM-DD hh:mm:ss.millis UTC [3210064]: [4-1] db=DATABASE, user=USER_ACCOUNT STATEMENT: SELECT 1 FROM (SELECT FROM company_name_table) t; /* Federated query from BigQuery. Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID */ YYYY-MM-DD hh:mm:ss.millis UTC [3210532]: [2-1] db=DATABASE, user=USER_ACCOUNT STATEMENT: SELECT "company_id", "company type_id" FROM (SELECT FROM company_name_table) t; /* Federated query from BigQuery. Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID */
Weitere Informationen zu Cloud Logging finden Sie unter Cloud Logging.
Fehlerbehebung
In diesem Abschnitt werden mögliche Fehler beschrieben, die beim Senden einer föderierten Abfrage an AlloyDB auftreten können, und es werden mögliche Lösungen zur Fehlerbehebung bereitgestellt.
Problem: Verbindung zum Datenbankserver konnte nicht hergestellt werden. Fehlermeldung:
Invalid table-valued function EXTERNAL_QUERY Connect to PostgreSQL server failed: server closed the connection unexpectedly. This probably means the server terminated abnormally before or while processing the request.
Lösung: Prüfen Sie, ob Sie gültige Anmeldedaten verwendet und alle Voraussetzungen erfüllt haben, um die Verbindung zu AlloyDB zu erstellen.
Prüfen Sie, ob das automatisch erstellte Dienstkonto beim Erstellen einer Verbindung zu AlloyDB die Rolle „AlloyDB-Client“ (roles/alloydb.client) hat.
Weitere Informationen finden Sie unter Zugriff auf das Dienstkonto gewähren.