Consultas federadas de AlloyDB

Como analista de datos, puedes consultar datos de AlloyDB para PostgreSQL desde BigQuery mediante consultas federadas.

La federación de BigQuery con AlloyDB permite a BigQuery consultar datos alojados en AlloyDB en tiempo real sin tener que copiarlos ni moverlos.

Antes de empezar

Consultar datos

Para enviar una consulta federada a AlloyDB desde una consulta de GoogleSQL, usa la función EXTERNAL_QUERY.

Supongamos que almacena una tabla de clientes en BigQuery y una tabla de ventas en AlloyDB, y quiere combinar las dos tablas en una sola consulta. En el siguiente ejemplo se hace una consulta federada a una tabla de AlloyDB llamada orders y se unen los resultados con una tabla de BigQuery llamada mydataset.customers.

La consulta de ejemplo incluye tres partes:

  1. Ejecuta la consulta externa SELECT customer_id, MIN(order_date) AS first_order_date FROM orders GROUP BY customer_id en la base de datos de AlloyDB para obtener la fecha del primer pedido de cada cliente mediante la función EXTERNAL_QUERY.

  2. Une la tabla de resultados de la consulta externa con la tabla de clientes de BigQuery por customer_id.

  3. Selecciona la información del cliente y la fecha del primer pedido en el conjunto de resultados final.

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;

Ver el esquema de una tabla de AlloyDB

Puedes usar la función EXTERNAL_QUERY para consultar tablas information_schema y acceder a metadatos de bases de datos. Por ejemplo, puedes enumerar todas las tablas de la base de datos o ver el esquema de la tabla. Para obtener más información, consulta las tablas information_schema de 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';");

Hacer un seguimiento de las consultas federadas de BigQuery

Cuando ejecutas una consulta federada en AlloyDB, BigQuery anota la consulta con un comentario similar al siguiente:

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

Si monitorizas los registros para comprobar el uso de las consultas, la siguiente anotación puede ayudarte a identificar las consultas procedentes de BigQuery.

  1. Ve a la página Explorador de registros.

    Ir al Explorador de registros

  2. En la pestaña Consulta, introduce la siguiente consulta:

    resource.type="alloydb.googleapis.com/Instance"
    textPayload=~"Federated query from BigQuery"
    
  3. Haz clic en Realizar una consulta.

    Si hay registros disponibles para las consultas federadas de BigQuery, en Resultados de la consulta se mostrará una lista de registros similar a la siguiente.

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

    Para obtener más información sobre Cloud Logging, consulta Cloud Logging.

Solución de problemas

En esta sección se describen los posibles errores que pueden surgir al enviar una consulta federada a AlloyDB y se ofrecen posibles soluciones.

Problema: no se ha podido conectar al servidor de la base de datos y se ha producido el siguiente error: 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.

Solución: Asegúrate de haber usado credenciales válidas y de haber seguido todos los requisitos previos al crear la conexión con AlloyDB. Comprueba si la cuenta de servicio que se crea automáticamente cuando se crea una conexión con AlloyDB tiene el rol de cliente de AlloyDB (roles/alloydb.client). Para obtener más información, consulta Conceder acceso a la cuenta de servicio.

Siguientes pasos