Query federate AlloyDB

In qualità di analista di dati, puoi eseguire query sui dati in AlloyDB per PostgreSQL da BigQuery utilizzando query federate.

La federazione di BigQuery AlloyDB consente a BigQuery di eseguire query sui dati che risiedono in AlloyDB in tempo reale senza copiare o spostare i dati.

Prima di iniziare

Query sui dati

Per inviare una query federata ad AlloyDB da una query GoogleSQL, utilizza la funzione EXTERNAL_QUERY.

Supponiamo di archiviare una tabella di un cliente in BigQuery mentre archivi una tabella delle vendite in AlloyDB e di voler unire le due tabelle in un'unica query. L'esempio seguente crea una query federata a una tabella AlloyDB denominata orders e unisce i risultati a una tabella BigQuery denominata mydataset.customers.

La query di esempio include tre parti:

  1. Esegui la query esterna SELECT customer_id, MIN(order_date) AS first_order_date FROM orders GROUP BY customer_id nel database AlloyDB per ottenere la data del primo ordine per ciascun cliente tramite la funzione EXTERNAL_QUERY.

  2. Unire la tabella dei risultati della query esterna alla tabella dei clienti in BigQuery per customer_id.

  3. Seleziona i dati del cliente e la data del primo ordine nell'insieme di risultati finale.

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;

Visualizza uno schema di tabella AlloyDB

Puoi utilizzare la funzione EXTERNAL_QUERY per eseguire query sulle tabelle information_schema in modo da accedere ai metadati del database. Ad esempio, puoi elencare tutte le tabelle nel database o visualizzare lo schema della tabella. Per saperne di più, consulta l'articolo sulle tabelle information_schema di 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';");

Tieni traccia delle query federate di BigQuery

Quando esegui una query federata su AlloyDB, BigQuery annota la query con un commento simile al seguente:

/* Federated query from BigQuery. Project ID: PROJECT_ID, BigQuery Job ID: JOB_ID. */

Se stai monitorando i log per l'utilizzo delle query, la seguente annotazione può aiutarti a identificare le query provenienti da BigQuery.

  1. Vai alla pagina Esplora log.

    Vai a Esplora log

  2. Nella scheda Query, inserisci la seguente query:

    resource.type="alloydb.googleapis.com/Instance"
    textPayload=~"Federated query from BigQuery"
    
  3. Fai clic su Esegui query.

    Se sono disponibili record per le query federate di BigQuery, in Risultati delle query viene visualizzato un elenco di record simile al seguente.

    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
    */
    

    Per saperne di più su Cloud Logging, consulta Cloud Logging.

Risoluzione dei problemi

Questa sezione descrive i potenziali errori che potresti riscontrare durante l'invio di una query federata ad AlloyDB e fornisce possibili risoluzioni dei problemi.

Problema: impossibile connettersi al server di database con questo errore: 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.

Soluzione: assicurati di aver utilizzato credenziali valide e di aver seguito tutti i prerequisiti durante la creazione della connessione ad AlloyDB. Controlla se l'account di servizio creato automaticamente quando viene creata una connessione ad AlloyDB ha il ruolo Client AlloyDB (roles/alloydb.client). Per ulteriori informazioni, consulta Concedere l'accesso all'account di servizio.

Passaggi successivi