Crear vistas materializadas
.En este documento se describe cómo crear vistas materializadas en BigQuery. Antes de leer este documento, familiarízate con la introducción a las vistas materializadas.
Antes de empezar
Concede roles de gestión de identidades y accesos (IAM) que proporcionen a los usuarios los permisos necesarios para realizar cada tarea de este documento.
Permisos obligatorios
Para crear vistas materializadas, necesitas el permiso de gestión de identidades y accesos bigquery.tables.create.
Cada uno de los siguientes roles de gestión de identidades y accesos predefinidos incluye los permisos que necesitas para crear una vista materializada:
bigquery.dataEditorbigquery.dataOwnerbigquery.admin
Para obtener más información sobre la gestión de identidades y accesos (IAM) de BigQuery, consulta el artículo sobre el control de acceso con IAM.
Crear vistas materializadas
Para crear una vista materializada, selecciona una de las siguientes opciones:
SQL
Usa la instrucción CREATE MATERIALIZED VIEW.
En el siguiente ejemplo se crea una vista materializada con el número de clics de cada ID de producto:
En la Google Cloud consola, ve a la página BigQuery.
En el editor de consultas, introduce la siguiente instrucción:
CREATE MATERIALIZED VIEW PROJECT_ID.DATASET.MATERIALIZED_VIEW_NAME AS ( QUERY_EXPRESSION );
Haz los cambios siguientes:
PROJECT_ID: el nombre del proyecto en el que quieres crear la vista materializada. Por ejemplo,myproject.DATASET: el nombre del conjunto de datos de BigQuery en el que quieres crear la vista materializada. Por ejemplo,mydataset. Si vas a crear una vista materializada sobre una tabla de BigLake de Amazon Simple Storage Service (Amazon S3) (versión preliminar), asegúrate de que el conjunto de datos se encuentre en una región admitida.MATERIALIZED_VIEW_NAME: el nombre de la vista materializada que quieras crear (por ejemplo,my_mv).QUERY_EXPRESSION: la expresión de consulta de GoogleSQL que define la vista materializada. Por ejemplo,SELECT product_id, SUM(clicks) AS sum_clicks FROM mydataset.my_source_table.
Haz clic en Ejecutar.
Para obtener más información sobre cómo ejecutar consultas, consulta Ejecutar una consulta interactiva.
Ejemplo
En el siguiente ejemplo se crea una vista materializada con el número de clics de cada ID de producto:
CREATE MATERIALIZED VIEW myproject.mydataset.my_mv_table AS ( SELECT product_id, SUM(clicks) AS sum_clicks FROM myproject.mydataset.my_base_table GROUP BY product_id );
Terraform
Usa el recurso google_bigquery_table.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configurar la autenticación para bibliotecas de cliente.
En el siguiente ejemplo se crea una vista llamada my_materialized_view:
Para aplicar la configuración de Terraform en un Google Cloud proyecto, sigue los pasos que se indican en las siguientes secciones.
Preparar Cloud Shell
- Abre Cloud Shell.
-
Define el Google Cloud proyecto predeterminado en el que quieras aplicar tus configuraciones de Terraform.
Solo tienes que ejecutar este comando una vez por proyecto y puedes hacerlo en cualquier directorio.
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Las variables de entorno se anulan si defines valores explícitos en el archivo de configuración de Terraform.
Preparar el directorio
Cada archivo de configuración de Terraform debe tener su propio directorio (también llamado módulo raíz).
-
En Cloud Shell, crea un directorio y un archivo nuevo en él. El nombre del archivo debe tener la extensión
.tf. Por ejemplo,main.tf. En este tutorial, el archivo se denominamain.tf.mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
Si estás siguiendo un tutorial, puedes copiar el código de ejemplo de cada sección o paso.
Copia el código de ejemplo en el archivo
main.tfque acabas de crear.También puedes copiar el código de GitHub. Se recomienda usar esta opción cuando el fragmento de Terraform forma parte de una solución integral.
- Revisa y modifica los parámetros de ejemplo para aplicarlos a tu entorno.
- Guarda los cambios.
-
Inicializa Terraform. Solo tienes que hacerlo una vez por cada directorio.
terraform init
Si quieres usar la versión más reciente del proveedor de Google, incluye la opción
-upgrade:terraform init -upgrade
Aplica los cambios
-
Revisa la configuración y comprueba que los recursos que va a crear o actualizar Terraform se ajustan a tus expectativas:
terraform plan
Haga las correcciones necesarias en la configuración.
-
Aplica la configuración de Terraform ejecutando el siguiente comando e introduciendo
yesen la petición:terraform apply
Espera hasta que Terraform muestre el mensaje "Apply complete!".
- Abre tu Google Cloud proyecto para ver los resultados. En la Google Cloud consola, ve a tus recursos en la interfaz de usuario para comprobar que Terraform los ha creado o actualizado.
API
Llama al método tables.insert
y envía un
recurso Table
con un campo materializedView definido:
{ "kind": "bigquery#table", "tableReference": { "projectId": "PROJECT_ID", "datasetId": "DATASET", "tableId": "MATERIALIZED_VIEW_NAME" }, "materializedView": { "query": "QUERY_EXPRESSION" } }
Haz los cambios siguientes:
PROJECT_ID: el nombre del proyecto en el que quieres crear la vista materializada. Por ejemplo,myproject.DATASET: el nombre del conjunto de datos de BigQuery en el que quieres crear la vista materializada. Por ejemplo,mydataset. Si vas a crear una vista materializada sobre una tabla de BigLake de Amazon Simple Storage Service (Amazon S3) (versión preliminar), asegúrate de que el conjunto de datos se encuentre en una región admitida.MATERIALIZED_VIEW_NAME: el nombre de la vista materializada que quieras crear (por ejemplo,my_mv).QUERY_EXPRESSION: la expresión de consulta de GoogleSQL que define la vista materializada. Por ejemplo,SELECT product_id, SUM(clicks) AS sum_clicks FROM mydataset.my_source_table.
Ejemplo
En el siguiente ejemplo se crea una vista materializada con el número de clics de cada ID de producto:
{ "kind": "bigquery#table", "tableReference": { "projectId": "myproject", "datasetId": "mydataset", "tableId": "my_mv" }, "materializedView": { "query": "select product_id,sum(clicks) as sum_clicks from myproject.mydataset.my_source_table group by 1" } }
Java
Antes de probar este ejemplo, sigue las Javainstrucciones de configuración de la guía de inicio rápido de BigQuery con bibliotecas de cliente. Para obtener más información, consulta la documentación de referencia de la API Java de BigQuery.
Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.
Una vez que se haya creado correctamente la vista materializada, aparecerá en el panel Explorador de BigQuery en la Google Cloud consola. En el siguiente ejemplo se muestra un esquema de una vista materializada:
A menos que inhabilite la actualización automática, BigQuery iniciará una actualización completa asíncrona de la vista materializada. La consulta finaliza rápidamente, pero la actualización inicial puede seguir ejecutándose.
Control de acceso
Puedes conceder acceso a una vista materializada a nivel de conjunto de datos, vista o columna. También puedes definir el acceso en un nivel superior de la jerarquía de recursos de gestión de identidades y accesos.
Para consultar una vista materializada, se necesita acceso a la vista y a sus tablas base. Para compartir una vista materializada, puedes conceder permisos a las tablas base o configurar una vista materializada como vista autorizada. Para obtener más información, consulta Vistas autorizadas.
Para controlar el acceso a las vistas en BigQuery, consulta Vistas autorizadas.
Compatibilidad con consultas de vistas materializadas
Las vistas materializadas usan una sintaxis de SQL restringida. Las consultas deben usar el siguiente patrón:
[ WITH cte [, …]] SELECT [{ ALL | DISTINCT }] expression [ [ AS ] alias ] [, ...] FROM from_item [, ...] [ WHERE bool_expression ] [ GROUP BY expression [, ...] ] from_item: { table_name [ as_alias ] | { join_operation | ( join_operation ) } | field_path | unnest_operator | cte_name [ as_alias ] } as_alias: [ AS ] alias
Limitaciones de las consultas
Las vistas materializadas tienen las siguientes limitaciones.
Requisitos de agregación
Los agregados de la consulta de la vista materializada deben ser resultados. No se admite el cálculo, el filtrado ni la combinación basados en un valor agregado. Por ejemplo, no se puede crear una vista a partir de la siguiente consulta porque produce un valor calculado a partir de un agregado, COUNT(*) / 10 as cnt.
SELECT TIMESTAMP_TRUNC(ts, HOUR) AS ts_hour, COUNT(*) / 10 AS cnt FROM mydataset.mytable GROUP BY ts_hour;
Solo se admiten las siguientes funciones de agregación:
ANY_VALUE(pero no más deSTRUCT)APPROX_COUNT_DISTINCTARRAY_AGG(pero no más deARRAYoSTRUCT)AVGBIT_ANDBIT_ORBIT_XORCOUNTCOUNTIFHLL_COUNT.INITLOGICAL_ANDLOGICAL_ORMAXMINMAX_BY(pero no más deSTRUCT)MIN_BY(pero no más deSTRUCT)SUM
Funciones de SQL no admitidas
Las siguientes funciones de SQL no se admiten en las vistas materializadas:
UNION ALL(Asistencia en vista previa)LEFT OUTER JOIN(asistencia en la versión preliminar)RIGHT/FULL OUTER JOIN.- Combinaciones automáticas, también conocidas como el uso de un
JOINen la misma tabla más de una vez. - Funciones de ventana.
ARRAYsubconsultas.- Funciones no deterministas, como
RAND(),CURRENT_DATE(),SESSION_USER()oCURRENT_TIME(). - Funciones definidas por el usuario (UDF).
TABLESAMPLE.FOR SYSTEM_TIME AS OF.- Funciones de IA generativa.
Compatibilidad con LEFT OUTER JOIN y UNION ALL
Para solicitar comentarios o asistencia sobre esta función, envía un correo a bq-mv-help @google.com.
Las vistas materializadas incrementales admiten LEFT OUTER JOIN y UNION ALL.
Las vistas materializadas con las instrucciones LEFT OUTER JOIN y UNION ALL comparten las limitaciones de otras vistas materializadas incrementales. Además, smart
tuning no se admite en las vistas materializadas con union all o left outer join.
Ejemplos
En el siguiente ejemplo se crea una vista materializada incremental agregada con LEFT JOIN. Esta vista se actualiza de forma incremental cuando se añaden datos a la tabla de la izquierda.
CREATE MATERIALIZED VIEW dataset.mv AS ( SELECT s_store_sk, s_country, s_zip, SUM(ss_net_paid) AS sum_sales, FROM dataset.store_sales LEFT JOIN dataset.store ON ss_store_sk = s_store_sk GROUP BY 1, 2, 3 );
En el siguiente ejemplo se crea una vista materializada incremental agregada con UNION ALL. Esta vista se actualiza de forma incremental cuando se añaden datos a una o a ambas tablas. Para obtener más información sobre las actualizaciones incrementales, consulta Actualizaciones incrementales.
CREATE MATERIALIZED VIEW dataset.mv PARTITION BY DATE(ts_hour) AS ( SELECT SELECT TIMESTAMP_TRUNC(ts, HOUR) AS ts_hour, SUM(sales) sum_sales FROM (SELECT ts, sales from dataset.table1 UNION ALL SELECT ts, sales from dataset.table2) GROUP BY 1 );
Restricciones de control de acceso
- Si la consulta de un usuario sobre una vista materializada incluye columnas de la tabla base a las que no puede acceder debido a la seguridad a nivel de columna, la consulta falla y se muestra el mensaje
Access Denied. - Si un usuario consulta una vista materializada, pero no tiene acceso completo a todas las filas de las tablas base de la vista materializada, BigQuery ejecuta la consulta en las tablas base en lugar de leer los datos de la vista materializada. De esta forma, la consulta respeta todas las restricciones de control de acceso. Esta limitación también se aplica al consultar tablas con columnas enmascaradas.
Cláusula WITH y expresiones de tabla comunes (CTEs)
Las vistas materializadas admiten cláusulas WITH y expresiones de tabla comunes.
Las vistas materializadas con cláusulas WITH deben seguir el patrón y las limitaciones de las vistas materializadas sin cláusulas WITH.
Ejemplos
En el siguiente ejemplo se muestra una vista materializada que usa una cláusula WITH:
WITH tmp AS ( SELECT TIMESTAMP_TRUNC(ts, HOUR) AS ts_hour, * FROM mydataset.mytable ) SELECT ts_hour, COUNT(*) AS cnt FROM tmp GROUP BY ts_hour;
En el siguiente ejemplo se muestra una vista materializada que usa una cláusula WITH que no se admite porque contiene dos cláusulas GROUP BY:
WITH tmp AS ( SELECT city, COUNT(*) AS population FROM mydataset.mytable GROUP BY city ) SELECT population, COUNT(*) AS cnt GROUP BY population;
Vistas materializadas sobre tablas de BigLake
Google CloudPara crear vistas materializadas sobre tablas de BigLake, la tabla de BigLake debe tener habilitado el almacenamiento en caché de metadatos sobre los datos de Cloud Storage y la vista materializada debe tener un valor de opción max_staleness mayor que la tabla base.
Las vistas materializadas de las tablas de BigLake admiten el mismo conjunto de consultas que otras vistas materializadas.
Ejemplo
Creación de una vista agregada simple mediante una tabla base de BigLake:
CREATE MATERIALIZED VIEW sample_dataset.sample_mv OPTIONS (max_staleness=INTERVAL "0:30:0" HOUR TO SECOND) AS SELECT COUNT(*) cnt FROM dataset.biglake_base_table;
Para obtener información sobre las limitaciones de las vistas materializadas en tablas de BigLake, consulte Vistas materializadas en tablas de BigLake.
Vistas materializadas sobre tablas externas de Apache Iceberg
Puedes hacer referencia a tablas de Iceberg grandes en vistas materializadas en lugar de migrar esos datos al almacenamiento gestionado por BigQuery.
Crear una vista materializada sobre una tabla Iceberg
En el siguiente ejemplo se crea una vista materializada alineada con las particiones sobre una tabla Iceberg base particionada:
CREATE MATERIALIZED VIEW