Todos los productos
Search
Centro de documentos

Realtime Compute for Apache Flink:Crear y usar tablas materializadas

Última actualización: Sep 03, 2026

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
  • Si una tabla ascendente también es una tabla materializada, la actualización de los datos de la tabla descendente debe ser 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.

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 SELECT admite todas las consultas de Flink SQL.

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 WITH ('partition.fields.#.date-formatter' = 'yyyyMMdd'). Para obtener más información sobre cómo utilizar los parámetros, consulte los ejemplos del procedimiento.

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.

  • CONTINUOUS: Un trabajo de streaming actualiza la tabla materializada de forma incremental. Los datos descendentes se vuelven visibles inmediatamente o después de completar un punto de control.

  • FULL: Un flujo de trabajo activa periódicamente actualizaciones por lotes para la tabla materializada. En este modo, el motor determina automáticamente si debe realizar una actualización completa o incremental. Para obtener más información, consulte Incremental updates for a materialized table. El ciclo de actualización de datos coincide con la configuración de actualización de los datos. De forma predeterminada, los datos se sobrescriben a nivel de tabla. Si existen columnas de particionamiento, puede optar por actualizar solo la partición más reciente o actualizar todas las particiones.

Procedimiento

  1. Inicie sesión en la consola de Realtime Compute for Apache Flink.

  2. En la columna Actions del espacio de trabajo deseado, haga clic en Console.

  3. En el panel de navegación izquierdo, haga clic en Catalogs y luego haga clic en el catálogo de Apache Paimon deseado.

  4. Haga clic en la base de datos deseada y luego en Create Materialized Table.

    Suponga que tiene una tabla de origen llamada orders con una clave principal order_id, un nombre de categoría order_name y un campo de fecha ds. A continuación se muestran ejemplos de cómo crear tablas materializadas basadas en esta tabla:

    • Cree una tabla materializada mt_order basada en la tabla orders. 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_id basada en la tabla materializada mt_order. La consulta selecciona order_id y ds como columnas de la tabla, establece order_id como clave principal, ds como 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_ds basada en la tabla materializada mt_order y especifique un date-formatter (formato de hora) para la columna de particionamiento ds. Cada vez que se ejecuta una programación, la hora de programación menos la actualización se convierte al valor de partición ds correspondiente. Por ejemplo, si la actualización de los datos se establece en 1 hora y la hora de programación es 2024-01-01 00:00:00, el valor calculado de ds es 20231231, y solo se actualizan los datos de la partición ds = '20231231'. Si la hora programada es 2024-01-01 01:00:00, el valor calculado de ds es 20240101, y se actualizan los datos de la partición ds = '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
      ;
      Nota
      • En 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-formatter especifica 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.

  5. Inicie o detenga la actualización de la tabla materializada.

    1. Haga clic en la tabla materializada deseada dentro de su catálogo.

    2. En la esquina superior derecha, haga clic en Start o Stop.

      Nota

      Si detiene una actualización en curso, el trabajo finalizará el ciclo de actualización actual antes de detenerse.

  6. 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

  1. 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
    ;
  2. 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.quantity AS total_price, e incluye una nueva condición WHERE orders.price * orders.quantity > 1000. En el área Table Columns, el nuevo campo total_price (DOUBLE) se resalta en verde.

  3. Haga clic en OK. Puede ver la columna recién agregada y la lógica de consulta modificada en la pestaña Table Schema.

Importante

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-formatter no 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> y WHERE <column> [NOT] IN <subquery> no son compatibles.

    UNION

    Solo se admite UNION ALL.

    JOIN

    • Se admite INNER JOIN.

    • LEFT/RIGHT/FULL [OUTER] JOIN no son compatibles, excepto en los casos específicos de LATERAL JOIN y lookup join descritos a continuación.

    • Se admite [LEFT [OUTER]] JOIN LATERAL con 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, como SELECT * FROM a, b WHERE a.id = b.id.

    • El cálculo incremental para INNER JOIN todaví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.

  1. Haga clic en la tabla materializada deseada dentro de su catálogo.

  2. 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ón ds=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.

      Nota
      • Al 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.

      Nota
      • Durante 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.

  3. 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

  1. 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.

  2. 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 O&M > Data Lineage 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