Föderierte AlloyDB-Abfragen
Als Datenanalyst können Sie Daten in AlloyDB for PostgreSQL mithilfe von föderierten Abfragen aus 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 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 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_id
wird in der AlloyDB-Datenbank ausgeführt, um das erste Bestelldatum für jeden Kunden über die FunktionEXTERNAL_QUERY
abzurufen.Verknüpfen Sie die Ergebnistabelle der externen Abfrage mit der Kundentabelle in BigQuery anhand von
customer_id
.Wählen Sie in der endgültigen Ergebnismenge 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 aufrufen. 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, annotiert BigQuery die Abfrage mit einem Kommentar ähnlich dem folgenden:
/* Federated query from BigQuery. Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID. */
Wenn Sie Logs für die Abfragenutzung überwachen, können Sie mit der folgenden Annotation Abfragen identifizieren, die von BigQuery stammen.
Rufen Sie die Seite Log-Explorer auf.
Geben Sie im Tab Abfrage die folgende Abfrage ein:
resource.type="alloydb.googleapis.com/Instance" textPayload=~"Federated query from BigQuery"
Klicken Sie auf Abfrage ausführen.
Wenn Einträge für föderierte BigQuery-Abfragen verfügbar sind, wird unter Abfrageergebnisse eine Liste von Einträgen ä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 potenzielle Fehler beschrieben, die beim Senden einer föderierten Abfrage an AlloyDB auftreten können. Außerdem werden mögliche Lösungen zur Fehlerbehebung angegeben.
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 beim Erstellen der Verbindung zu AlloyDB gültige Anmeldedaten verwendet und alle Voraussetzungen erfüllt 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.