Compartir vía


CREATE MATERIALIZED VIEW (canalizaciones)

Una vista materializada es una vista en la que los resultados precalculados están disponibles para su consulta y se pueden actualizar para reflejar cambios en la entrada. las vistas materializadas están respaldadas por una canalización. Cada vez que se actualiza una vista materializada, los resultados de la consulta se recalculan para reflejar los cambios en los conjuntos de datos ascendentes. Puede actualizar las vistas materializadas manualmente o según una programación.

Para más información sobre cómo realizar o programar actualizaciones, consulte Ejecución de una actualización de canalización.

Syntax

CREATE [OR REFRESH] [PRIVATE] MATERIALIZED VIEW
  view_name
  [ column_list ]
  [ view_clauses ]
  AS query

column_list
   ( { column_name column_type column_properties } [, ...]
    [ column_constraint ] [, ...]
    [ , table_constraint ] [...] )

   column_properties
      { NOT NULL | COMMENT column_comment | column_constraint | MASK clause } [ ... ]

view_clauses
  { USING DELTA |
    PARTITIONED BY (col [, ...]) |
    CLUSTER BY clause |
    LOCATION path |
    COMMENT view_comment |
    TBLPROPERTIES clause |
    WITH { ROW FILTER clause } } [...]

Parámetros

  • REFRESH

    Si se especifica, creará la vista o actualizará una vista existente y su contenido.

  • PRIVADO

    Crea una vista materializada privada. Una vista materializada privada puede ser útil como una tabla intermedia dentro de una canalización que no desea publicar en el catálogo.

    • No se añaden al catálogo y solo son accesibles dentro del flujo de trabajo de definición.
    • Pueden tener el mismo nombre que un objeto existente en el catálogo. Dentro de la canalización, si una vista materializada privada y un objeto del catálogo tienen el mismo nombre, las referencias al nombre se resolverán en la vista materializada privada.
    • Las vistas materializadas privadas solo se conservan durante la duración de la canalización, no solo una sola actualización.

    Las vistas materializadas privadas se crearon anteriormente con el TEMPORARY parámetro .

  • view_name

    Nombre de la vista recién creada. El nombre completo de vista debe ser único.

    Las vistas materializadas privadas pueden tener el mismo nombre que un objeto publicado en el catálogo.

  • lista_de_columnas

    También puede etiquetar las columnas del resultado de la consulta de la vista. Si proporciona una lista de columnas, el número de alias de columna debe coincidir con el número de expresiones en la consulta. Si no se especificase ninguna lista de columnas, los alias se derivarán del cuerpo de la vista.

  • restricción_de_tabla

    Importante

    Esta característica está en versión preliminar pública.

    Al especificar un esquema, puede definir claves principales y externas. Las restricciones son informativas y no se aplican. Consulte la cláusula CONSTRAINT en la referencia del lenguaje SQL.

    Nota:

    Para definir restricciones en las tablas, tu canalización debe estar habilitada para el Unity Catalog.

  • view_clauses

    Puede especificar opcionalmente particiones, comentarios y propiedades definidas por el usuario para la vista materializada. Cada subcláusula solo se puede especificar una vez.

    • USO DE DELTA

      Especifica el formato de datos. La única opción es DELTA.

      Esta cláusula es opcional y el valor predeterminado es DELTA.

    • PARTICIONADO POR

      Lista opcional de una o varias columnas que se van a usar para crear particiones en la tabla. Mutuamente excluyente con CLUSTER BY.

      La agrupación en clústeres líquidos proporciona una solución flexible y optimizada para la agrupación en clústeres. Considere la posibilidad de usar CLUSTER BY en lugar de PARTITIONED BY para canalizaciones.

    • CLUSTER BY

      Habilite la agrupación en clústeres líquidos en la tabla y defina las columnas que se usarán como claves de agrupación en clústeres. Use la agrupación automática en clústeres líquidos con CLUSTER BY AUTOy Databricks elige de forma inteligente las claves de agrupación en clústeres para optimizar el rendimiento de las consultas. Mutuamente excluyente con PARTITIONED BY.

      Consulte Uso de clústeres líquidos para tablas.

    • UBICACIÓN

      Ubicación de almacenamiento opcional para los datos de la tabla. Si no se establece, el sistema establecerá de manera predeterminada la ubicación de almacenamiento de la canalización.

      Esta opción solo está disponible al publicar en metastore de Hive. En el catálogo de Unity, la ubicación se administra automáticamente.

    • COMENTARIO

      Descripción opcional de la tabla.

    • TBLPROPERTIES

      Lista opcional de propiedades de la tabla.

    • CONROW FILTER

    Importante

    Esta característica está en versión preliminar pública.

    Agrega una función de filtro de fila a la tabla. Las consultas futuras de esa tabla reciben un subconjunto de las filas para las que la función se evalúa como TRUE. Esto resulta útil para el control de acceso específico, ya que permite a la función inspeccionar la identidad y las pertenencias a grupos del usuario que realiza la invocación para decidir si se filtran determinadas filas.

    Consulte la cláusula ROW FILTER.

  • consulta

    Consulta que define el conjunto de datos de la tabla.

Permisos necesarios

El usuario de ejecución para una canalización debe tener los permisos siguientes:

  • Privilegio SELECT en las tablas base a las que hace referencia la vista materializada.
  • USE CATALOG privilegios en el catálogo primario y el privilegio USE SCHEMA en el esquema primario.
  • Privilegio CREATE MATERIALIZED VIEW en el esquema de la vista materializada.

Para que los usuarios puedan actualizar la canalización en la que se define la vista materializada, necesitan:

  • USE CATALOG privilegios en el catálogo primario y el privilegio USE SCHEMA en el esquema primario.
  • Propiedad de la vista materializada o privilegio REFRESH en la vista materializada.
  • El propietario de la vista materializada debe tener el SELECT privilegio sobre las tablas base a las que hace referencia la vista materializada.

Para que un usuario pueda consultar la vista materializada resultante, necesita:

  • USE CATALOG privilegios en el catálogo primario y el privilegio USE SCHEMA en el esquema primario.
  • Privilegio SELECT sobre la vista materializada.

Limitaciones

  • Cuando en una vista materializada con un sum agregado sobre una columna que puede contener valores NULL se elimine el último valor no NULL de esa columna y, por tanto, solo queden NULL valores en esa columna: el valor agregado resultante de la vista materializada devolverá cero en lugar de NULL.
  • La referencia de columna no requiere un alias. Las expresiones de referencia que no sean de columna requieren un alias, como en el ejemplo siguiente:
    • Permitido: SELECT col1, SUM(col2) AS sum_col2 FROM t GROUP BY col1
    • No permitido: SELECT col1, SUM(col2) FROM t GROUP BY col1
  • NOT NULL debe especificarse manualmente junto con PRIMARY KEY para que sea una instrucción válida.
  • Las vistas materializadas no admiten columnas de identidad ni claves suplentes.
  • Las vistas materializadas no admiten comandos OPTIMIZE y VACUUM. El mantenimiento se produce automáticamente.
  • No se admite el cambio de nombre de la tabla ni el cambio del propietario.
  • No se admiten columnas generadas, columnas de identidad y columnas predeterminadas.

Examples

-- Create a materialized view by reading from an external data source, using the default schema:
CREATE OR REFRESH MATERIALIZED VIEW taxi_raw
AS SELECT * FROM read_files("/databricks-datasets/nyctaxi/sample/json/")

-- Create a materialized view by reading from a dataset defined in a pipeline:
CREATE OR REFRESH MATERIALIZED VIEW filtered_data
AS SELECT
  ...
FROM taxi_raw

-- Specify a schema and clustering columns for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales
(customer_id STRING,
  customer_name STRING,
  number_of_line_items STRING,
  order_datetime STRING,
  order_number LONG,
  order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime))
) CLUSTER BY (order_day_of_week, customer_id)
COMMENT "Raw data on sales"
AS SELECT * FROM ...

-- Specify partition columns for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales
(customer_id STRING,
  customer_name STRING,
  number_of_line_items STRING,
  order_datetime STRING,
  order_number LONG,
  order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime))
) PARTITIONED BY (order_day_of_week)
COMMENT "Raw data on sales"
AS SELECT * FROM ...

-- Specify a primary and foreign key constraint for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales
(customer_id STRING NOT NULL PRIMARY KEY,
  customer_name STRING,
  number_of_line_items STRING,
  order_datetime STRING,
  order_number LONG,
  order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime)),
  CONSTRAINT fk_customer_id FOREIGN KEY (customer_id) REFERENCES main.default.customers(customer_id)
)
COMMENT "Raw data on sales"
AS SELECT * FROM ...

-- Specify a row filter and mask clause for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales (
  customer_id STRING MASK catalog.schema.customer_id_mask_fn,
  customer_name STRING,
  number_of_line_items STRING COMMENT 'Number of items in the order',
  order_datetime STRING,
  order_number LONG,
  order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime))
)
COMMENT "Raw data on sales"
WITH ROW FILTER catalog.schema.order_number_filter_fn ON (order_number)
AS SELECT * FROM sales_bronze