介绍

物化表是 Flink SQL 引入的一种新的表类型,旨在简化批处理和流处理数据管道,提供一致的开发体验。在创建物化表时,通过指定数据新鲜度和查询,Flink 引擎会自动推导出物化表的 Schema ,并创建相应的数据刷新管道,以达到指定的新鲜度。

注意:该功能目前是一个 MVP(最小可行产品)功能,仅在 SQL Gateway中可用,并且只支持部署作业到 Flink Standalone集群。

核心概念

物化表包含以下核心概念:数据新鲜度、刷新模式、查询定义和 Schema

数据新鲜度

数据新鲜度定义了物化表数据相对于基础表更新的最大滞后时间。它并非绝对保证,而是 Flink 尝试达到的目标。框架会尽力确保物化表中的数据在指定的新鲜度内刷新。

数据新鲜度是物化表的一个关键属性,具有两个主要作用:

  • 确定刷新模式:目前有连续模式和全量模式。关于如何确定刷新模式的详细信息,请参阅 materialized-table.refresh-mode.freshness-threshold 配置项。
    • 连续模式:启动 Flink 流作业,持续刷新物化表数据。
    • 全量模式:工作流调度器定期触发 Flink 批处理作业,全量刷新物化表数据。
  • 确定刷新频率
    • 连续模式下,数据新鲜度转换为 Flink 流作业的 checkpoint 间隔。
    • 全量模式下,数据新鲜度转换为工作流的调度周期,例如 cron 表达式。

刷新模式

刷新模式有连续模式和全量模式两种。默认情况下,根据数据新鲜度推断刷新模式。用户可以为特定业务场景显式指定刷新模式,它的优先级高于根据数据新鲜度推导的刷新模式。

  • 连续模式:Flink 流作业会增量更新物化表数据,下游数据会立即可见,或者等 checkpoint 完成时才可见,由对应的 Connector 行为决定。
  • 全量模式:调度器会定期触发对物化表数据的全量覆盖,其数据刷新周期与工作流的调度周期相匹配。
    • 默认的覆盖行为是表级别的。如果分区字段存在,并且通过 partition.fields.#.date-formatter 指定了时间分区字段格式,则按照分区粒度覆盖,即每次只刷新最新的分区。

查询定义

物化表的查询定义支持所有 Flink SQL 查询。查询结果用于填充物化表。在连续模式下,查询结果会持续更新到物化表中,而在全量模式下,每次查询结果都会覆盖更新到物化表。

Schema

物化表的 Schema 定义与普通表相同,可以声明主键和分区字段。其列名和类型会从相应的查询中推导,用户无法手动指定。