Föderierte Abfragen für AlloyDB
Als Datenanalyst können Sie Daten in AlloyDB for PostgreSQL mithilfe von föderierten Abfragen über BigQuery abfragen.
Mit der BigQuery-AlloyDB-Föderation kann BigQuery Daten in AlloyDB in Echtzeit abfragen, ohne die Daten kopieren oder verschieben zu müssen.
Hinweise
- Achten Sie darauf, dass Ihr BigQuery-Administrator eine AlloyDB-Verbindung erstellt und 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 werden 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 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 information_schema-Tabellen in PostgreSQL.
-- 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, wird die Abfrage in BigQuery mit einem Kommentar ähnlich dem folgenden versehen:
/* Federated query from BigQuery. Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID. */
Wenn Sie Logs zur Abfragenutzung beobachten, können Sie mit der folgenden Annotation Abfragen 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 in den Abfrageergebnissen eine Liste mit Datensätzen ähnlich der folgenden angezeigt.
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 genannt.
Problem:Verbindung zum Datenbankserver mit folgendem Fehler konnte nicht hergestellt werden:
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: Achten Sie darauf, dass Sie gültige Anmeldedaten verwendet und alle Voraussetzungen erfüllt haben,
als Sie die Verbindung zu AlloyDB erstellt haben.
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.