Todos os produtos
Search
Central de documentação

Realtime Compute for Apache Flink:Materialized Table (Build a Unified Stream-Batch Lakehouse)

Última atualização: Sep 24, 2026

Este tópico apresenta o passo a passo para construir um pipeline de analytics de lakehouse unificado stream-batch usando materialized tables. Você também aprenderá a alternar entre processamento batch e stream ajustando a frequência de atualização de uma materialized table para habilitar atualizações de dados em tempo real.

O que é uma materialized table?

Uma materialized table é um novo tipo de tabela introduzido no Flink SQL para simplificar pipelines de dados tanto para processamento batch quanto stream, entregando uma experiência de desenvolvimento unificada. Ao criar uma materialized table, não é necessário declarar campos nem seus tipos. Em vez disso, especifique a frequência de atualização desejada e uma instrução de consulta. O motor Flink infere automaticamente o schema a partir da consulta e cria o pipeline de atualização de dados correspondente para atender ao requisito especificado. Para mais informações, consulte Materialized Table Management.

Diagrama do Pipeline de Lakehouse em Tempo Real

  1. O Flink grava dados das fontes no Paimon para formar a camada Operational Data Store (ODS).

  2. O Flink enriquece e amplia os dados da camada ODS por meio de joins entre tabelas e grava o resultado em uma materialized table para formar a camada Data Warehouse Detail (DWD).

  3. Múltiplas materialized tables com diferentes configurações de atualização executam agregações de negócio multidimensionais para formar a camada Data Warehouse Service (DWS), que atende às consultas das aplicações.

image

Pré-requisitos

  • Você criou um workspace do Flink. Para mais informações, consulte Activate Realtime Compute for Apache Flink.

  • Se você acessa recursos como usuário RAM ou função RAM (Resource Access Management), confirme que possui as permissões necessárias para o console do Flink. Para mais informações, consulte Permission Management.

Etapa 1: Preparar dados de teste

  1. Crie um Paimon Catalog.

    As materialized tables são viabilizadas pelo Apache Paimon. É necessário criar um Paimon Catalog com o tipo de metastore Filesystem . Pule esta etapa se você já tiver um. Para mais informações, consulte Create a Paimon Catalog.

    Create a Paimon Catalog

    1. Acesse o Realtime Compute Management Console.

    2. Clique em Console na coluna Actions do workspace desejado.

    3. No painel de navegação à esquerda, escolha Catalogs e clique em Create Catalog. Selecione Apache Paimon e clique em Next.

      Descrição dos parâmetros:

      Item de configuração

      Descrição

      Observações

      metastore

      Tipo de metastore.

      Este exemplo usa filesystem como tipo de metastore.

      catalog name

      Nome do Paimon Catalog.

      Insira um nome em inglês personalizado. Este exemplo usa paimon.

      warehouse

      Diretório do data warehouse no OSS.

      Use o formato oss://<bucket>/<object>. Onde:

      • <bucket>: o nome do seu bucket OSS.

      • <object>: o caminho onde seus dados estão armazenados.

      Verifique os nomes do bucket e do object no OSS Management Console.

      fs.oss.endpoint

      Endereço de conexão do OSS.

      Se o Flink e o OSS estiverem na mesma região, use o endpoint de rede privada. Caso contrário, use o endpoint de rede pública. Para mais informações, consulte Regions and endpoints.

      fs.oss.accessKeyId

      AccessKey ID da sua conta Alibaba Cloud ou usuário RAM com permissões de leitura e gravação no OSS.

      Para obter instruções, consulte Create an AccessKey. Para evitar expor credenciais em texto simples, use variáveis. Para mais informações, consulte Variable management.

      fs.oss.accessKeySecret

      AccessKey secret da sua conta Alibaba Cloud ou usuário RAM com permissões de leitura e gravação no OSS.

  2. Crie a tabela de log comportamental do usuário ods_user_log e a tabela de informações de produtos ods_dim_product.

    1. Acesse o Realtime Compute Management Console.

    2. Clique em Console na coluna Actions do workspace desejado.

    3. No painel de navegação à esquerda, escolha Development > Scripts. Copie e cole o seguinte código para criar as tabelas source.

      Este exemplo assume que você já criou um Paimon Catalog chamado paimon e está usando o banco de dados padrão (default).
      CREATE TABLE `paimon`.`default`.`ods_user_log` (
        item_id INT NOT NULL,
        user_id INT NOT NULL,
        vtime TIMESTAMP(6),
        ds VARCHAR(10) NOT NULL
      ) 
      PARTITIONED BY(ds)
      WITH (
        'bucket' = '4',            -- Set the number of buckets to 4.
        'bucket-key' = 'item_id'   -- Specify the key used to determine bucket assignment. Rows with the same item_id go into the same bucket.
      );
      CREATE TABLE `paimon`.`default`.`ods_dim_product` (
        item_id INT NOT NULL,
        title VARCHAR(255),
        pict_url VARCHAR(255), 
        brand_id INT,
        seller_id INT,
        PRIMARY KEY(item_id) NOT ENFORCED
      ) WITH (
        'bucket' = '4',
        'bucket-key' = 'item_id'
      );
    4. Clique em Run no canto superior direito para criar as tabelas.

    5. No painel de navegação à esquerda, escolha Catalogs, clique no seu Paimon Catalog e, em seguida, clique em Refresh para visualizar as novas tabelas.

  3. Use o Faker connector for simulated data generation para gerar dados simulados e gravá-los nas tabelas Paimon.

    1. No painel de navegação à esquerda, escolha Development > ETL.

    2. Clique em New, selecione Blank stream draft, clique em Next e, em seguida, clique em Create.

    3. Copie a seguinte instrução SQL para o editor SQL.

      CREATE TEMPORARY TABLE `user_log` (
        item_id INT,  // Product ID
        user_id INT,  // User ID
        vtime TIMESTAMP,  
        ds AS DATE_FORMAT(CURRENT_DATE,'yyyyMMdd')
      ) WITH (
        'connector' = 'faker',    -- Faker connector
        'fields.item_id.expression'='#{number.numberBetween ''0'',''1000''}',    -- Generate a random number between 0 and 1000
        'fields.user_id.expression'='#{number.numberBetween ''0'',''100''}',
        'fields.vtime.expression'='#{date.past ''5'',''HOURS''}',           -- Generate data up to 5 hours before the current time
        'rows-per-second' = '3'   -- Generate 3 rows per second
       );
       CREATE TEMPORARY TABLE `dim_product` (
        item_id INT NOT NULL,
        title VARCHAR(255),
        pict_url VARCHAR(255), 
        brand_id INT,
        seller_id INT,
        PRIMARY KEY(item_id) NOT ENFORCED
       ) WITH (
        'connector' = 'faker',    -- Faker connector
        'fields.item_id.expression'='#{number.numberBetween ''0'',''1000''}',
        'fields.title.expression'='#{book.title}',
        'fields.pict_url.expression'='#{internet.domainName}',
        'fields.brand_id.expression'='#{number.numberBetween ''1000'',''10000''}',   
        'fields.seller_id.expression'='#{number.numberBetween ''1000'',''10000''}',
        'rows-per-second' = '3'        -- Generate 3 rows per second
       );
      BEGIN STATEMENT SET; 
      INSERT INTO `paimon`.`default`.`ods_user_log` 
        SELECT 
        item_id,
        user_id,
        vtime,
        CAST(ds AS VARCHAR(10)) AS ds
      FROM `user_log`;
      INSERT INTO `paimon`.`default`.`ods_dim_product`
        SELECT 
        item_id,
        title,
        pict_url,
        brand_id,
        seller_id
      FROM `dim_product`;
      END; 
    4. Clique em Deploy no canto superior direito para implantar o job.

    5. No painel de navegação à esquerda, escolha O&M > Deployments. Clique em Start na coluna Actions do job desejado, selecione Initial Mode e clique em Start.

  4. Consulte os dados simulados.

    No painel de navegação à esquerda, escolha Development > Scripts. Copie a seguinte instrução SQL para o editor SQL e clique em Run no canto superior direito.

    SELECT * FROM `paimon`.`default`.ods_dim_product LIMIT 10;
    SELECT * FROM `paimon`.`default`.ods_user_log LIMIT 10;

Etapa 2: Criar materialized tables

Esta seção constrói uma materialized table da camada DWD chamada dwd_user_log_product ampliando as tabelas source. Em seguida, cria materialized tables downstream com base na dwd_user_log_product para realizar agregações de negócio, completando a camada DWS.

  1. Construa a camada DWD do data warehouse criando a materialized table dwd_user_log_product.

    1. No painel de navegação à esquerda, escolha Catalogs e clique no Paimon Catalog desejado.

    2. Clique no banco de dados desejado (neste exemplo, default) e, em seguida, clique em Create Materialized Table. Copie a seguinte instrução SQL para o editor SQL e clique em Create.

      -- DWD layer widening logic
      CREATE MATERIALIZED TABLE dwd_user_log_product(
          PRIMARY KEY (item_id) NOT ENFORCED
      )
      PARTITIONED BY(ds)
      WITH (
        'partition.fields.ds.date-formatter' = 'yyyyMMdd'
      )
      FRESHNESS = INTERVAL '1' HOUR      -- Refresh every hour
      AS SELECT
        l.ds,
        l.item_id,
        l.user_id,
        l.vtime,
        r.brand_id,
        r.seller_id
      FROM `paimon`.`default`.`ods_user_log` l INNER JOIN `paimon`.`default`.`ods_dim_product` r
      ON l.item_id = r.item_id;
  2. Construa a camada DWS executando agregações de negócio multidimensionais com base na materialized table dwd_user_log_product.

    Este tópico demonstra como criar a materialized table dws_overall, que agrega contagens de PV/UV por hora ao longo do dia. Siga a etapa anterior para criar a materialized table dws_overall.

    // Aggregate PV/UV by day
    CREATE MATERIALIZED TABLE dws_overall(
        PRIMARY KEY(ds, hh) NOT ENFORCED
    )
    PARTITIONED BY(ds)
    WITH (
      'partition.fields.ds.date-formatter' = 'yyyyMMdd'
    )
    FRESHNESS = INTERVAL '1' HOUR   -- Refresh every hour
    AS SELECT 
        ds,
        COALESCE(hh, 'day') AS hh,
        count(*) AS pv,
        count(distinct user_id) AS uv
        FROM (SELECT ds, date_format(vtime, 'HH') AS hh, user_id 
    FROM `paimon`.`default`.`dwd_user_log_product`) tmp
    GROUP BY GROUPING SETS(ds, (ds, hh));

Etapa 3: Atualizar materialized tables

Iniciar atualização

A frequência de atualização de dados neste exemplo está definida para 1 hora. Após clicar em Start, as atualizações de dados ficarão defasadas em relação às atualizações da tabela base por pelo menos 1 hora.

  1. No painel de navegação à esquerda, escolha O&M > Data Lineage e pesquise pela materialized table desejada.

  2. Clique na view da materialized table e, em seguida, clique em Start no canto inferior direito da página.

Repreenchimento de dados

O repreenchimento de dados regrava dados históricos em partições específicas ou em toda a tabela. Use este recurso para corrigir resultados de processamento stream ou para atualizar imediatamente os dados de jobs batch que ainda não atingiram o horário programado.

Selecione a view da materialized table dwd_user_log_product e clique em Trigger Update no canto inferior direito. Insira a data atual (por exemplo, 20241216) como nome da partição, marque Cascade update downstream materialized table e clique em Confirm. Na caixa de diálogo de confirmação, clique em Confirm para sobrescrever os dados imediatamente.

Para mais informações sobre repreenchimento de dados, consulte Backfill historical data.

Modificar a frequência de atualização de dados

Ajuste a frequência de atualização de dados para atualizar as materialized tables diariamente, por hora, por minuto ou até por segundo, conforme as necessidades do seu negócio.

Atualize as configurações de atualização das materialized tables dwd_user_log_product e dws_overall. Clique na view da materialized table e, em seguida, clique em Modify Freshness no canto inferior direito. Defina a frequência de atualização para o nível de minutos para obter atualizações em tempo real.

Para mais informações sobre como modificar a frequência de atualização de dados, consulte Modify data freshness.

Etapa 4: Consultar materialized tables

Prévia de dados

É possível visualizar as últimas 100 linhas de uma materialized table.

  1. No painel de navegação à esquerda, escolha O&M > Data Lineage e pesquise pela materialized table desejada.

  2. Clique na view da materialized table e, em seguida, clique em Details no canto inferior direito da página.

  3. Na aba Data Preview da materialized table, clique no ícone Query.

Consulta de dados

No painel de navegação à esquerda, escolha Development > Scripts. Copie a seguinte instrução SQL para o editor SQL, selecione o trecho de código e clique em Run para consultar a materialized table dws_overall.

SELECT * FROM `paimon`.`default`.dws_overall ORDER BY hh;

Referências