Este tema explica cómo crear una tabla materializada, ejecutar el relleno de datos, modificar la actualización de los datos y consultar el linaje de datos.
Limitaciones
Esta función solo está disponible en Ververica Runtime (VVR) 8.0.10 y versiones posteriores.
Las tablas materializadas solo se pueden crear en un Apache Paimon catalog que utilice Filesystem o DLF para el almacenamiento de metadatos. Los catálogos personalizados de Apache Paimon no son compatibles.
Debe contar con los permisos necesarios para desarrollar y desplegar trabajos. Para obtener más información, consulte Development console authorization.
No se admiten objetos temporales, como tablas temporales, funciones definidas por el usuario temporales ni vistas temporales.
Crear una tabla materializada
Sintaxis
CREATE MATERIALIZED TABLE [catalog_name.][db_name.]table_name
-- Primary key constraint
[([CONSTRAINT constraint_name] PRIMARY KEY (column_name, ...) NOT ENFORCED)]
[COMMENT table_comment]
-- Partition key
[PARTITIONED BY (partition_column_name1, partition_column_name2, ...)]
-- With options
[WITH (key1=val1, key2=val2, ...)]
-- Data freshness
FRESHNESS = INTERVAL '<num>' { SECOND | MINUTE | HOUR | DAY }
-- Refresh mode
[REFRESH_MODE = { CONTINUOUS | FULL }]
AS <select_statement>
Parámetros
|
Parámetro |
Obligatorio |
Descripción |
|
FRESHNESS |
Sí |
La actualización de los datos de la tabla materializada, que define la latencia máxima permitida para las actualizaciones de datos desde las tablas de origen. Nota
|
|
AS <select_statement> |
Sí |
Define la consulta que llena la tabla materializada. La tabla ascendente puede ser una tabla materializada, una tabla normal o una vista. La instrucción |
|
PRIMARY KEY |
No |
Las columnas opcionales que identifican de forma única cada fila de la tabla. Estas columnas no pueden contener valores nulos. |
|
PARTITIONED BY |
No |
Las columnas opcionales utilizadas para particionar la tabla materializada. |
|
Opciones WITH |
No |
Define las propiedades de la tabla y los parámetros de formato de hora para las columnas de particionamiento. Por ejemplo, puede establecer el parámetro de formato de hora para una columna de particionamiento con |
|
REFRESH_MODE |
No |
Especifica el modo de actualización de la tabla materializada. Un modo de actualización especificado tiene prioridad sobre el modo inferido automáticamente por el framework según la actualización de los datos. Esto le permite gestionar escenarios específicos.
|
Procedimiento
Inicie sesión en la consola de Realtime Compute for Apache Flink.
En la columna Actions del espacio de trabajo deseado, haga clic en Console.
En el panel de navegación izquierdo, haga clic en Catalogs y luego haga clic en el catálogo de Apache Paimon deseado.
-
Haga clic en la base de datos deseada y luego en Create Materialized Table.
Suponga que tiene una tabla de origen llamada
orderscon una clave principalorder_id, un nombre de categoríaorder_namey un campo de fechads. A continuación se muestran ejemplos de cómo crear tablas materializadas basadas en esta tabla:-
Cree una tabla materializada
mt_orderbasada en la tablaorders. La consulta selecciona todas las columnas y la actualización de los datos se establece en 5 segundos.CREATE MATERIALIZED TABLE mt_order FRESHNESS = INTERVAL '5' SECOND AS SELECT * FROM `paimon`.`db`.`orders` ; -
Cree una tabla materializada
mt_idbasada en la tabla materializadamt_order. La consulta seleccionaorder_idydscomo columnas de la tabla, estableceorder_idcomo clave principal,dscomo columna de particionamiento y la actualización de los datos en 30 minutos.CREATE MATERIALIZED TABLE mt_id ( PRIMARY KEY (order_id) NOT ENFORCED ) PARTITIONED BY(ds) FRESHNESS = INTERVAL '30' MINUTE AS SELECT order_id,ds FROM mt_order ; -
Cree la tabla materializada
mt_dsbasada en la tabla materializadamt_ordery especifique undate-formatter(formato de hora) para la columna de particionamientods. Cada vez que se ejecuta una programación, la hora de programación menos la actualización se convierte al valor de particióndscorrespondiente. Por ejemplo, si la actualización de los datos se establece en 1 hora y la hora de programación es2024-01-01 00:00:00, el valor calculado de ds es 20231231, y solo se actualizan los datos de la particiónds = '20231231'. Si la hora programada es2024-01-01 01:00:00, el valor calculado de ds es 20240101, y se actualizan los datos de la particiónds = '20240101'.CREATE MATERIALIZED TABLE mt_ds PARTITIONED BY(ds) WITH ( 'partition.fields.ds.date-formatter' = 'yyyyMMdd' ) FRESHNESS = INTERVAL '1' HOUR AS SELECT order_id,order_name,ds FROM mt_order ;NotaEn
partition.fields.#.date-formatter, el marcador de posición#debe ser una columna de particionamiento válida de tipo STRING.La opción
partition.fields.#.date-formatterespecifica el formato de partición de tiempo para la tabla materializada. El marcador de posición#representa el nombre de una columna de particionamiento de tipo cadena. Esta información permite al sistema identificar qué partición actualizar durante una actualización programada.
-
-
Inicie o detenga la actualización de la tabla materializada.
Haga clic en la tabla materializada deseada dentro de su catálogo.
-
En la esquina superior derecha, haga clic en Start o Stop.
NotaSi detiene una actualización en curso, el trabajo finalizará el ciclo de actualización actual antes de detenerse.
-
Consulte los detalles del trabajo de la tabla materializada.
En la pestaña Table Schema, en la sección Basic Information, haga clic en el ID del trabajo junto a Latest Job o Workflow para ver los detalles.
Modificar una consulta de tabla materializada
Limitaciones
Solo puede modificar la consulta de tablas materializadas creadas en VVR 11.1 o posterior.
-
Al modificar una consulta, solo puede agregar columnas y modificar la lógica de cálculo. No puede cambiar el orden de las columnas existentes ni modificar sus definiciones.
Operación
Compatible
Descripción
Agregar una nueva columna
Sí
Puede añadir nuevas columnas al esquema manteniendo el orden de las columnas existentes.
Modificar la lógica de cálculo de una columna existente (sin cambiar su nombre o tipo)
Sí
Puede modificar la lógica de cálculo, pero el nombre de la columna y el tipo de datos deben permanecer iguales.
Cambiar el orden de las columnas existentes
No
El orden de las columnas es fijo. Para cambiarlo, debe eliminar y volver a crear la tabla materializada.
Modificar el nombre o el tipo de datos de una columna existente
No
Debe eliminar y volver a crear la tabla materializada.
Ejemplo
-
Haga clic en Edit Table y modifique la consulta. El siguiente código proporciona un ejemplo:
ALTER MATERIALIZED TABLE `paimon`.`default`.`mt-orders` AS SELECT *, price * quantity AS total_price FROM orders WHERE price * quantity > 1000 ; -
Haga clic en Preview para ver una comparación del antes y el después.
El cuadro de diálogo Materialized Table Change Details muestra los siguientes cambios: en el área SQL Statement, la instrucción SQL cambia de la original
SELECT *a SELECT *,orders.price*orders.quantityAStotal_price, e incluye una nueva condición WHEREorders.price*orders.quantity> 1000. En el área Table Columns, el nuevo campototal_price(DOUBLE) se resalta en verde. Haga clic en OK. Puede ver la columna recién agregada y la lógica de consulta modificada en la pestaña Table Schema.
Agregar columnas generalmente no afecta a los consumidores descendentes. Sin embargo, si un trabajo descendente depende del análisis sintáctico dinámico (como SELECT * o mapeo automático de campos) al consumir datos de la tabla materializada ascendente, el trabajo podría fallar o reportar un error de desajuste de formato de datos. Se recomienda evitar el análisis sintáctico dinámico, usar listas de columnas fijas y actualizar el esquema de la tabla descendente oportunamente cada vez que cambie el esquema ascendente.
Actualizaciones incrementales
Limitaciones
Esta función solo está disponible en VVR 8.0.11 y versiones posteriores.
Modos de actualización
Las tablas materializadas admiten tres modos de actualización: streaming, lote completo y lote incremental.
El modo se determina mediante la configuración de actualización de los datos. Una actualización menor a 30 minutos habilita el modo de streaming, mientras que 30 minutos o más habilitan el modo por lotes. En el modo por lotes, el motor decide automáticamente entre una actualización completa o incremental. Una actualización incremental calcula solo los datos que han cambiado desde la última actualización y los fusiona en la tabla materializada. Una actualización completa calcula los datos de toda la tabla o partición y sobrescribe los datos existentes en la tabla materializada. En el modo por lotes, el motor prioriza las actualizaciones incrementales y recurre a una actualización completa solo cuando una actualización incremental no es posible.
Condiciones de actualización incremental
Una actualización incremental se realiza solo si la tabla materializada cumple todas las siguientes condiciones:
El parámetro
partition.fields.#.date-formatterno está configurado en la definición de la tabla.La tabla de origen no tiene definida una clave principal.
-
La consulta en la definición de la tabla materializada admite actualizaciones incrementales como se describe en la siguiente tabla:
Cláusula SQL
Compatibilidad
SELECT
Compatible con la selección de columnas y expresiones de funciones escalares, incluidas las funciones definidas por el usuario. Las funciones de agregación no son compatibles.
FROM
Compatible con nombres de tablas y subconsultas.
WITH
Compatible con expresiones de tabla comunes (CTE).
WHERE
Compatible con condiciones de filtro que incluyen diversas expresiones de funciones escalares, incluidas las funciones definidas por el usuario. Las subconsultas como
WHERE [NOT] EXISTS <subquery>yWHERE <column> [NOT] IN <subquery>no son compatibles.UNION
Solo se admite
UNION ALL.JOIN
-
Se admite
INNER JOIN. -
LEFT/RIGHT/FULL [OUTER] JOINno son compatibles, excepto en los casos específicos deLATERAL JOINy lookup join descritos a continuación. -
Se admite
[LEFT [OUTER]] JOIN LATERALcon una expresión de función de tabla (incluidas las funciones definidas por el usuario). -
Para lookup join, solo se admite
A [LEFT [OUTER]] JOIN B FOR SYSTEM_TIME AS OF PROCTIME().
Nota-
Se admiten uniones implícitas sin la palabra clave
JOIN, comoSELECT * FROM a, b WHERE a.id = b.id. -
El cálculo incremental para
INNER JOINtodavía lee los datos completos de ambas tablas de origen.
GROUP BY
No compatible.
-
Ejemplos de actualización incremental
Ejemplo 1: Procesar datos de la tabla de origen orders mediante funciones escalares.
CREATE MATERIALIZED TABLE mt_shipped_orders (
PRIMARY KEY (order_id) NOT ENFORCED
)
FRESHNESS = INTERVAL '30' MINUTE
AS
SELECT
order_id,
COALESCE(customer_id, 'Unknown') AS customer_id,
CAST(order_amount AS DECIMAL(10, 2)) AS order_amount,
CASE
WHEN status = 'shipped' THEN 'Completed'
WHEN status = 'pending' THEN 'In Progress'
ELSE 'Unknown'
END AS order_status,
DATE_FORMAT(order_ts, 'yyyyMMdd') AS order_date,
UDSF_ProcessFunction(notes) AS notes
FROM
orders
WHERE
status = 'shipped';
Ejemplo 2: Enriquecer datos de la tabla de origen orders mediante LATERAL JOIN y lookup join.
CREATE MATERIALIZED TABLE mt_enriched_orders (
PRIMARY KEY (order_id, order_tag) NOT ENFORCED
)
FRESHNESS = INTERVAL '30' MINUTE
AS
WITH o AS (
SELECT
order_id,
product_id,
quantity,
proc_time,
e.tag AS order_tag
FROM
orders,
LATERAL TABLE(UDTF_StringSplitFunction(tags, ',')) AS e(tag))
SELECT
o.order_id,
o.product_id,
p.product_name,
p.category,
o.quantity,
p.price,
o.quantity * p.price AS total_amount,
order_tag
FROM o
LEFT JOIN
product_info FOR SYSTEM_TIME AS OF PROCTIME() AS p
ON
o.product_id = p.product_id;
Relleno de datos
Anteriormente, corregir los resultados del procesamiento de flujos para datos históricos requería desarrollar un trabajo por lotes independiente. Al usar tablas materializadas, puede rellenar directamente particiones de datos históricos. Este enfoque unifica el procesamiento por lotes y de streaming, lo que reduce los costos de desarrollo y operación y mantenimiento.
Haga clic en la tabla materializada deseada dentro de su catálogo.
-
En la pestaña Data Information, rellene los datos.
Si definió una columna de particionamiento cuando created the materialized table, se trata de una tabla particionada. De lo contrario, es una tabla no particionada.
Tabla particionada
En la sección Partitions, haga clic en Trigger Update si es la primera vez que rellena datos o si la partición requerida no existe. Si ya existen particiones, puede seleccionar una partición específica y hacer clic en Refresh en la columna Actions.
Haga clic en la pestaña Data Information y realice las operaciones en el área Data Partitions en la parte inferior de la página.
Parámetros
Columna de particionamiento: La columna de particionamiento de la tabla. Por ejemplo, si introduce
20241201, se rellenarán todos los datos de la particiónds=20241201.Task Name: El nombre de la tarea de relleno de datos.
-
Update Range (Opcional): Especifica si se deben aplicar actualizaciones en cascada a las tablas materializadas descendentes. A partir de la tabla actual, se actualizan todas las tablas materializadas en el linaje de datos. La profundidad máxima admitida del linaje descendente es de 6 niveles.
NotaAl actualizar una tabla particionada, las tablas materializadas descendentes deben tener exactamente las mismas columnas de particionamiento que la tabla inicial. De lo contrario, la operación de actualización fallará.
Si una actualización falla para alguna tabla materializada en el linaje, todos los nodos descendentes subsiguientes también fallarán.
Deployment Target: Puede seleccionar una cola o un clúster de sesiones. La selección predeterminada es
default-queue.
Tabla no particionada
En la sección Data Detail, haga clic en Refresh.
Parámetros
Task Name: El nombre de la tarea de relleno de datos.
-
Update Range: Esta opción no está disponible para tablas no particionadas.
NotaDurante una actualización, los datos descendentes se actualizan completamente.
Si una actualización falla para alguna tabla materializada en el linaje, todos los nodos descendentes subsiguientes también fallarán.
Las actualizaciones en cascada no son compatibles si la tabla inicial es una tabla no particionada actualizada por un trabajo de streaming.
Deployment Target: Puede seleccionar una cola o un clúster de sesiones. La selección predeterminada es
default-queue.
-
Relleno programado y por lotes.
Puede usar Task Orchestration para crear un flujo de trabajo para la tabla materializada y ejecutar trabajos de relleno según una programación. También puede usar la función de relleno de datos del flujo de trabajo para rellenar datos en bloque durante un intervalo de tiempo específico.
Modificar la actualización de los datos
En el catálogo correspondiente, haga clic en la base de datos de la materialized table y luego haga clic en la materialized table deseada.
-
En la esquina superior derecha, haga clic en Modify Freshness.
Si la tabla materializada no tiene clave principal, no puede cambiar su método de actualización entre streaming y lotes. El sistema utiliza un trabajo de streaming para valores de actualización de datos menores a 30 minutos y un trabajo por lotes para valores de 30 minutos o más. Por lo tanto, no se permite cambiar la actualización cruzando este umbral de 30 minutos para tablas sin clave principal.
Si la tabla ascendente es una tabla materializada, asegúrese de que la actualización de los datos de la tabla descendente sea un múltiplo entero positivo de la actualización de los datos de la tabla ascendente.
La actualización máxima de los datos es de un día.
Consultar el linaje de datos
En el panel de navegación izquierdo, vaya a para ir a la página de linaje de datos de tablas materializadas. En esta página, puede ver las relaciones de linaje entre todas las tablas materializadas. También puede realizar operaciones como Start/Stop Update y Modify Freshness directamente en una tabla materializada. Haga clic en Details para navegar a la página de detalles de la tabla materializada correspondiente.
Haga clic en un nodo de tabla materializada para expandir su panel de detalles. El panel muestra el valor de Data Freshness, Latest Update Time y Materialized Table Status, y proporciona una acción Trigger Update.
Documentos relacionados
Para obtener una introducción a las tablas materializadas, consulte Manage materialized tables.
Para aprender a construir un pipeline analítico en un data lakehouse con procesamiento unificado por lotes y streaming basado en Paimon y tablas materializadas, y cómo cambiar del modo por lotes al modo de streaming modificando la actualización de los datos para actualizaciones en tiempo real, consulte Quick start: Build a data lakehouse with unified batch and streaming processing by using materialized tables.