SeaTunnel 表模型与类型系统深度解析:从 CatalogTable 到 Schema Evolution 的完整指南
【免费下载链接】seatunnelSeaTunnel is a multimodal, high-performance, distributed, massive data integration tool.项目地址: https://gitcode.com/GitHub_Trending/se/seatunnel
导读
本文是 SeaTunnel 在"表模型(Table Model)"与"类型系统(Type System)"上的系统性总览,回答一个核心问题:schema 与 type 如何贯穿 connector、transform、sink 以及多引擎运行时。你将理解CatalogTable、TableSchema、Column、SeaTunnelDataType、SchemaChangeEvent这五个核心对象的职责边界与相互协作方式,掌握如何在作业中显式声明 schema、如何把异构系统(JDBC、Avro、JSON、CDC)的类型归一到 SeaTunnel 的统一类型模型,以及如何借助 Schema Evolution 让流式作业自动适应上游 DDL 变更。读完本文,你可以独立排查"schema 报错到底出在 source、transform 还是 sink"这类问题,并写出可安全上生产的多表与 CDC 同步作业。
为什么需要系统级视角
SeaTunnel 已经分别存在 schema 配置文档与CatalogTable元数据文档,但缺少一篇从系统视角解释"表模型"和"类型系统"如何贯穿整条数据管线的总览页。数据集成场景中,绝大多数故障的根源不在单点功能,而在 schema 在各阶段之间传递时的契约断裂——字段丢了、类型不兼容、主键对不上、分区元数据缺失。因此,理解这套模型,本质上就是理解 SeaTunnel 作业的"数据结构契约"是如何定义、传播与演化的。
Schema 在 SeaTunnel 作业里的位置
Schema 不是只有 source 才关心的事情,它会贯穿整条 pipeline。下图展示了 schema 在作业中的流转路径:
用户配置或源端发现 | v CatalogTable / TableSchema | v Source 输出契约 | v Transform 规划与校验 | v Sink 兼容性与写入契约 | v 引擎翻译层与运行时执行这也是为什么 schema 出问题时,表面上可能出现在 connector、transform 或 sink 的不同阶段——因为 schema 本身就是一条"隐形的数据流",与行数据并行流动。判断问题出现在哪个阶段,需要先弄清楚每个阶段对 schema 的职责是什么。
核心构件
SeaTunnel 的表模型围绕五个核心对象展开:CatalogTable、TableSchema、Column、SeaTunnelDataType、SchemaChangeEvent。它们共同满足以下设计目标:
- 能足够准确地描述真实数据集成里的外部表和记录;
- 不依赖某一个执行引擎(Flink、Spark、Zeta 通用);
- 既支持静态 schema,也支持运行时 schema evolution;
- 能同时被 source、transform、sink 使用。
CatalogTable:顶层元数据对象
CatalogTable是顶层元数据对象,负责承载表标识以及 pipeline 需要的 schema 信息。在 CatalogTable.java 中,它的字段与文档描述完全对应:
| 字段 | 说明 |
|---|---|
tableId | TableIdentifier,唯一表标识,可定位到 catalog/database/schema/table |
tableSchema | TableSchema,列、主键、约束等模式定义 |
options | 连接器/表级选项(如实际表名、topic、format 等) |
partitionKeys | 分区键列表(可选) |
metadata | MetadataSchema,元数据列定义(如 CDC 的 source metadata 列) |
comment | 表注释 |
catalogName | 归属 catalog 信息 |
源码中CatalogTable提供getSeaTunnelRowType()方法,直接返回tableSchema.toPhysicalRowDataType(),即把逻辑 schema 转换为引擎运行时使用的物理行类型SeaTunnelRowType。此外还提供了多个of(...)工厂方法与copy()深拷贝方法,保证 options 与 partitionKeys 在传递过程中不会被意外共享修改(源码第 128-129 行显式new HashMap<>(options)、new ArrayList<>(partitionKeys))。
TableSchema:表结构契约
TableSchema描述一张表的逻辑结构,是 connector 和 transform 表达"表结构"时的核心契约。从 TableSchema.java 源码可见它由三部分组成:
columns:列定义列表(顺序敏感,List )primaryKey:主键定义(可选,PrimaryKey)constraintKeys:约束键列表(可选,List ,如唯一键、外键、向量索引键)
TableSchema采用 Builder 模式构建(TableSchema.builder()),并提供了copy()深拷贝方法,逐列复制 columns 与 constraintKeys。
Column:列定义
每个列对象提供比文档罗列的更多信息。从 Column.java 源码看,Column是抽象类,有两个具体子类PhysicalColumn(物理列)与MetadataColumn(元数据列),核心字段包括:
name:列名dataType:SeaTunnelDataType<?>统一类型columnLength:列长度(数值类型为最大精度,字符/二进制为字节长度)scale:小数位数(decimal 的 scale、时间类型的秒精度、向量维度)nullable:是否可空defaultValue:默认值comment:列注释sourceType:数据库侧原始类型(如varchar(50)、DECIMAL(20,5)),保留原始方言信息sinkType:目标库存储类型,通常在 transform 或 sink 场景指定options:连接器/列级扩展选项
Column还提供isPhysical()、copy(...)、rename(...)、reSourceType(...)等抽象方法,用于在 transform 或 schema evolution 时派生新列。columnLength与scale这两个字段是类型映射中精度保真的关键。
SeaTunnelDataType:可移植类型系统
SeaTunnelDataType是 SeaTunnel 的可移植类型系统。它的作用,是让 connector 能描述字段类型,而不把这种描述直接绑定到 Flink、Spark、JDBC、Avro 或某个数据库方言上。从 SeaTunnelDataType.java 源码看,它是一个泛型接口,只暴露两个方法:
public interface SeaTunnelDataType<T> extends Serializable { Class<T> getTypeClass(); // 类型对应的 Java 类 SqlType getSqlType(); // 类型对应的 SQL 标准类型 }所有具体类型实现(BasicType、DecimalType、LocalTimeType、ArrayType、MapType、SeaTunnelRowType、VectorType、PrimitiveByteArrayType等)都落在 seatunnel-api/src/main/java/org/apache/seatunnel/api/table/type 目录下。BasicType提供了预置单例,例如STRING_TYPE、BOOLEAN_TYPE、BYTE_TYPE(tinyint)、SHORT_TYPE(smallint)、INT_TYPE、LONG_TYPE(bigint)、FLOAT_TYPE、DOUBLE_TYPE、VOID_TYPE(null)等。
SchemaChangeEvent:结构变更载体
SchemaChangeEvent是表结构变更的事件化表达(见 SchemaChangeEvent.java)。它继承Event接口,核心语义是:变更必须能定位到具体表(通过tableIdentifier()/tablePath()),并携带变更后的完整表结构(getChangeAfter()/setChangeAfter()返回CatalogTable)。变更负载是"语义化描述"而非下游可直接执行的 SQL,因此下游可以根据自己的兼容性规则决定如何落地。
从 schema/event 目录 看,事件类型已经枚举化:
| 事件类 | 语义 |
|---|---|
AlterTableAddColumnEvent | 新增列(支持addFirst、addAfter定位插入位置) |
AlterTableDropColumnEvent | 删除列 |
AlterTableModifyColumnEvent | 修改列(类型/属性变化) |
AlterTableChangeColumnEvent | 重命名/更换列 |
AlterTableNameEvent | 重命名表 |
AlterColumnCommentEvent/AlterTableCommentEvent | 修改列/表注释 |
AlterTableColumnsEvent | 列级变更的聚合载体 |
RestoreTableSchemaEvent | 恢复表结构快照 |
以AlterTableAddColumnEvent为例,其getEventType()返回EventType.SCHEMA_CHANGE_ADD_COLUMN,并携带新列Column、是否插到首列first、以及插入位置afterColumn。
为什么必须有独立类型系统
SeaTunnel 面对的是大量异构系统。一条作业很可能是从一种类型系统读,再写到另一种类型系统:
- JDBC 类型
- Kafka / Avro 类型
- JSON payload
- 文件 schema
- CDC metadata 与 row kind
如果 SeaTunnel 不先把这些都归一到自己的类型模型里,那么 transform 和 sink 就都要同时理解引擎差异和 connector 差异,系统会迅速碎片化——每个 connector 各自实现一套"判断字段兼容"的逻辑,组合爆炸。独立类型系统就是为了解决这个问题:所有外部类型在进入 pipeline 之前先映射为SeaTunnelDataType,此后 transform、sink、引擎翻译层只面对一套类型语言。
这条"归一化"路径在源码中有直接体现:SeaTunnelDataTypeConvertorUtil.java 的deserializeSeaTunnelDataType(String field, String columnType)负责把用户声明的类型字符串解析为类型实例;而各 connector 侧则实现SeaTunnelDataTypeConvertor接口把 JDBC/Avro 等外部类型映射到 SeaTunnel 类型。
常见类型类别
SeaTunnel 的类型系统支持的不只是 primitive value。完整的类型清单可以从 SqlType.java 枚举中看到,比文档列举的范围更广:
基础类型
| SqlType | Java 值类型 | 说明 |
|---|---|---|
STRING | java.lang.String | 字符串 |
BOOLEAN | java.lang.Boolean | 布尔 |
TINYINT | java.lang.Byte | 常规 -128 至 127 |
SMALLINT | java.lang.Short | 常规 -32768 至 32767 |
INT | java.lang.Integer | 32 位整数 |
BIGINT | java.lang.Long | 64 位整数 |
FLOAT | java.lang.Float | 单精度浮点 |
DOUBLE | java.lang.Double | 双精度浮点 |
DECIMAL | java.math.BigDecimal | 定点小数,需 precision/scale |
BYTES | byte[] | 字节数组 |
DATE | java.time.LocalDate | 仅日期 |
TIME | java.time.LocalTime | 仅时间,100 纳秒精度 |
TIMESTAMP | java.time.LocalDateTime | 无时区时间戳 |
TIMESTAMP_TZ | java.time.OffsetDateTime | 带 UTC 偏移的时间戳 |
NULL | java.lang.Void | 空值 |
复杂类型
为支撑半结构化数据和 CDC payload,schema 模型支持嵌套结构:ARRAY(元素类型)、MAP(键值类型)、ROW(字段序列,可嵌套)。这很重要,因为现代数据集成链路很少从头到尾都是纯平面结构。
向量类型
值得注意的扩展是,SqlType枚举中还包含BINARY_VECTOR、FLOAT_VECTOR、FLOAT16_VECTOR、BFLOAT16_VECTOR、SPARSE_FLOAT_VECTOR,对应 VectorType 中的向量类型实现——这为 Milvus 等向量数据库连接器在 schema 层声明向量列提供了类型基础(对应 schema-feature.md 中VECTOR_INDEX_KEY约束类型的支持)。
Schema 从哪里来
在 SeaTunnel 里,schema 有三种来源,理解它们有助于判断"为什么我的作业拿到了这样的表结构"。
Source 发现的 Schema
有些 connector 能直接从外部系统获取 schema,例如关系型数据库、catalog、metadata service。这类 schema 由 source 在启动阶段通过元数据 API 探测得到,是"自动获得"的契约。
用户声明的 Schema
有些系统本身没有强 schema(NoSQL、消息队列),或者用户希望覆盖、补充 schema。这时 SeaTunnel 支持用户显式配置 schema。完整的配置语义见 Schema 特性简介。
传播或派生出的 Schema
Transform 可能会保留上游 schema,也可能裁剪字段、重命名字段、生成新字段或派生新 schema。这意味着 schema 并不是"只在 source 阶段读一次"的东西,而是作业逻辑契约的一部分——每个 transform 步骤的输入输出都对应一份 schema 的变换。
如何显式声明 Schema
Schema 配置结构
SchemaOptions提供了定义 schema 的全部配置项,其整体结构如下:
schema = { table = "database.schema.table" schema_first = false comment = "comment" partition_keys = ["dt"] columns = [ ... ] primaryKey { ... } constraintKeys { ... } }| 配置项 | 说明 |
|---|---|
table | schema 所属表标识符的表全名,支持database.schema.table、database.table、table三种粒度 |
metadata_table_id | 从外部元数据 SPI 服务(如 Gravitino)获取表结构,格式为{catalog}.{database}.{table};指定后不再使用手动columns |
schema_first | 默认false;设为true时table = "a.b"中a会被解析为 schema 而非 database |
comment | CatalogTable 的注释 |
partition_keys | 分区字段列表,可配合 sink 端${partition_keys}占位符使用(如多表同步 Iceberg 时按表建分区) |
columns | 列定义列表 |
primaryKey | 主键定义(name+columns) |
constraintKeys | 约束键列表 |
列(Columns)定义
每列可包含 name、type、nullable、columnLength、columnScale、defaultValue、comment 字段:
columns = [ { name = id type = bigint nullable = false columnLength = 20 defaultValue = 0 comment = "primary key id" } ]| 字段 | 是否必须 | 默认值 | 描述 |
|---|---|---|---|
name | 是 | - | 列的名称 |
type | 是 | - | 列的数据类型 |
nullable | 否 | true | 列是否可空 |
columnLength | 否 | 0 | 列的长度(数值为最大精度,字符/二进制为字节长度) |
columnScale | 否 | - | 列的精度(小数位数) |
defaultValue | 否 | null | 列的默认值 |
comment | 否 | null | 列的注释 |
主键(PrimaryKey)
主键用于 upsert 幂等键选择、schema 兼容性校验以及部分连接器的 DDL 自动生成:
primaryKey { name = id columns = [id] }约束键(constraintKeys)
约束键支持INDEX_KEY、UNIQUE_KEY、FOREIGN_KEY、VECTOR_INDEX_KEY四种类型。每项包含constraintName、constraintType、constraintColumns:
constraintKeys = [ { constraintName = "id_index" constraintType = KEY constraintColumns = [ { columnName = "id" sortType = ASC } ] }, ]当constraintType = VECTOR_INDEX_KEY时,每项需额外支持indexName(可选,默认列名)、indexType(如HNSW、IVF_FLAT、DISKANN,大小写不敏感)、metricType(如L2、IP、COSINE,大小写不敏感)。schema 解析层面后两者可选,但需要创建向量索引的 connector(如 Milvus)可能要求必填。
类型声明语法:基础与复杂类型
SeaTunnel 提供简单直接的基本类型声明方式。基本类型关键字包括string、boolean、tinyint、smallint、int、bigint、float、double、date、time、timestamp、null,关键字不区分大小写,可直接使用或加引号。null类型必须用双引号声明("null"),避免与 HOCON 中表示未定义对象的null混淆。
声明复杂类型时需注意:
- decimal:遵循
"decimal(precision, scale)"格式,必须用引号括起来,例如"decimal(10,2)"; - array:遵循
array<T>格式,元素类型为int、string、boolean、tinyint、smallint、bigint、float、double,必须加引号,例如"array<int>"; - map:遵循
map<K,V>格式,K为任意基本类型和 decimal,V为任意支持类型,必须加引号,例如"map<string, int>"; - row:用 HOCON 对象描述字段及类型,可嵌套,例如
{a = int, b = string},也支持字符串形式"{a = int, b = string}"与 JSON 形式。
完整示例:
schema { fields { c_decimal = "decimal(10, 2)" c_array = "array<int>" c_row = { c_int = int c_string = string c_row = { c_int = int } } # 在泛型中Hocon风格声明行类型 map0 = "map<string, {c_int = int, c_string = string, c_row = {c_int = int}}>" # 在泛型中Json风格声明行类型 map1 = "map<string, {\"c_int\":\"int\", \"c_string\":\"string\", \"c_row\":{\"c_int\":\"int\"}}>" } }类型声明的解析路径在 SeaTunnelDataTypeConvertorUtil.java 中实现:先尝试把类型字符串直接匹配SqlType枚举,匹配失败则进入parseComplexDataType解析decimal(...)、array<...>、map<...>等复合声明;同时提供向后兼容的别名映射(long -> bigint、short -> smallint、byte -> tinyint)。
Schema 在 Source、Transform、Sink 中的作用
Source 侧:产出输入契约
Source 使用 schema 来定义下游应该接收到什么。常见用途包括:
- 产出
CatalogTable - 表达表标识
- 暴露多表元数据
- 把外部类型映射到
SeaTunnelDataType
Source 侧常见失败模式:元数据读取失败(权限/网络/超时)、类型无法映射(外部类型超出 SeaTunnel 统一类型系统)、schema 漂移(运行中 DDL 导致产出的 CatalogTable 与真实数据不一致)。
Transform 侧:schema 逻辑
Transform 可能会:
- 保持 schema 不变
- 投影部分字段
- 重命名列
- 生成新列
- 映射 schema change event
也就是说,transform 不只是行级逻辑,很多时候也是 schema 逻辑。常见风险包括:schema 推断不精确(如 UDF、动态字段)、类型提升/缩窄导致的精度或溢出问题、字段重命名/删除导致下游找不到列。
Sink 侧:兼容性与写入契约
Sink 使用 schema 来判断当前输入是否可以安全写入目标端。常见检查包括:
- 字段是否存在(是否允许自动新增)
- 类型是否兼容(是否允许安全扩展)
- 是否满足主键要求(尤其是 upsert/exactly-once 语义)
- 分区元数据是否满足
- schema evolution 怎么处理
推荐策略是"早期失败":在作业启动阶段完成输入 schema 与目标表 schema 的兼容性校验,避免运行中才暴露不可写入;同时明确兼容规则——哪些类型扩展允许、哪些缩窄禁止、如何处理 nullability 变化。
多表与 CDC 场景下为什么更重要
多表作业
当 source 一次输出多张表时(例如tables_configs多表配置、CDC 捕获整个库),SeaTunnel 必须依赖稳定的表标识和 schema 模型,才能保证路由和 sink 落地正确。多表 schema 的配置方式参见 schema-feature.md 中的tables_configs列表结构,每张表拥有独立的table、columns、primaryKey、constraintKeys定义。
CDC 作业
在 CDC pipeline 中,schema 不是静态的。系统可能需要在运行时传播 schema change,因此 schema 处理天然和这些能力绑定:
SchemaChangeEvent- checkpoint 与恢复
- sink 侧兼容性逻辑
CDC 链路的关键特征是:行数据携带RowKind与来源元数据,结构变化作为事件流与数据流并行传播。事件化带来的核心要求是:变更事件必须纳入 checkpoint/恢复语义(保证"数据与变更事件的相对顺序"可恢复),Source 侧需保证同一表内顺序一致,防止"先收到数据后收到 DDL"的顺序错乱。更完整的链路描述见 CDC Pipeline 架构概览。
Schema Evolution 实战
启用开关与事件过滤
Schema evolution 在 CDC 源连接器中默认关闭,需要在 CDC 连接器中配置schema-changes.enabled = true来启用。该开关的定义位于 SourceOptions.java,源码注释明确:默认false,设为true后 schema 变更事件才会发送给下游。
除了总开关,还提供两个细粒度过滤选项:
schema-changes.include:仅发送列表中列出的事件类型(空列表表示全部允许);schema-changes.exclude:列表中列出的事件类型不发送,优先级高于 include(类型同时出现在两个列表时以 exclude 为准)。
两者合法取值均为SchemaChangeEventType.validNames(),其中update.columns是"所有列级变更"的分组别名。
支持范围(以当前仓库为准)
- 已支持引擎:Zeta;
- 已支持事件类型:
ADD COLUMN、DROP COLUMN、RENAME COLUMN、MODIFY COLUMN; - 已支持源:MySQL-CDC、Oracle-CDC;
- 已支持目标:JDBC(MySQL/Oracle/Postgres/Dameng/SqlServer)、StarRocks、Doris、Paimon、Elasticsearch、BigQuery(仅
ADD COLUMN)、Redis。
注意事项(来自 schema-evolution.md):目前模式演进不支持 transform;跨数据库类型(如 Oracle-CDC → Jdbc-Mysql)的 DDL 暂不支持列默认值;Oracle-CDC 场景下不能用SYS/SYSTEM用户修改表结构,且表名以ORA_TEMP_开头时 DDL 事件会被过滤;早期版本达梦数据库不支持Varchar改为Text。
示例:MySQL-CDC → JDBC(含 schema change)
env { # You can set engine configuration here parallelism = 5 job.mode = "STREAMING" checkpoint.interval = 5000 read_limit.bytes_per_second=7000000 read_limit.rows_per_second=400 } source { MySQL-CDC { server-id = 5652-5657 username = "st_user_source" password = "mysqlpw" table-names = ["shop.products"] url = "jdbc:mysql://mysql_cdc_e2e:3306/shop" schema-changes.enabled = true } } sink { jdbc { url = "jdbc:mysql://mysql_cdc_e2e:3306/shop" driver = "com.mysql.cj.jdbc.Driver" user = "st_user_sink" password = "mysqlpw" generate_sink_sql = true database = shop table = mysql_cdc_e2e_sink_table_with_schema_change_exactly_once primary_keys = ["id"] is_exactly_once = true xa_data_source_class_name = "com.mysql.cj.jdbc.MysqlXADataSource" } }多库多表路由与 Schema Evolution
只要每张上游表都能稳定映射到一个明确的物理下游表,模式演进就可以和多库多表任务一起工作。SeaTunnel 会在连接器启动前完成 Sink 占位符替换,可结合${database_name}、${schema_name}、${table_name}占位符做路由(参见 sink-options-placeholders.md)。
source { MySQL-CDC { database-names = ["shop_a", "shop_b"] table-names = ["shop_a.products", "shop_b.products"] url = "jdbc:mysql://mysql-host:3306" schema-changes.enabled = true } } sink { jdbc { url = "jdbc:mysql://mysql-host:3306" driver = "com.mysql.cj.jdbc.Driver" user = "root" password = "123456" generate_sink_sql = true database = "${database_name}_sink" table = "${table_name}" primary_keys = ["id"] multi_table_sink_replica = 2 } }在这个例子里,shop_a.products会写入shop_a_sink.products,shop_b.products会写入shop_b_sink.products。如果两张源表之后都执行ALTER TABLE products ADD COLUMN add_column1 VARCHAR(64), ADD COLUMN add_column2 INT,SeaTunnel 会分别把 schema 变更应用到各自的下游表,并继续保证每张下游表只接收自己所属源库的数据。
推荐做法:不同上游库的表路由到不同物理下游表以互相隔离;需要并行写入时可开启multi_table_sink_replica(模式变更按最终渲染出的物理下游表维度协调执行);若有意把多张上游表写入同一张物理下游表,需自行保证 schema 兼容且主键不冲突。
通配符捕获多库多表
source { MySQL-CDC { table-pattern = "sales_.*\\..*" url = "jdbc:mysql://mysql-host:3306" schema-changes.enabled = true } } sink { jdbc { url = "jdbc:mysql://mysql-host:3306" driver = "com.mysql.cj.jdbc.Driver" user = "root" password = "123456" generate_sink_sql = true database = "ods" table = "${database_name}_${table_name}" primary_keys = ["${primary_key}"] } }类型映射的高风险边界
类型系统最容易出问题的地方,通常都发生在系统边界上——"能编译通过"并不等于"可以安全上生产"。
高风险区域包括:
- decimal 的 precision / scale:
DECIMAL(p,s)的 p/s 必须完整保留,否则可能出现截断或溢出; - timestamp 语义与时区解释:
TIMESTAMP与TIMESTAMP WITH TIME ZONE语义差异需要明确,TIMESTAMP_TZ使用OffsetDateTime承载 UTC 偏移; - 嵌套 row / map / array 兼容性:跨系统同步嵌套结构时,字段顺序与名字需保持稳定;
- binary 表示:
BINARY/VARBINARY应映射为BYTES,不要静默转字符串; - nullability 假设:上游可空列在下游被声明为非空时的处理策略需要显式约定。
类型兼容性速查
类型扩展(通常安全):
INT → BIGINTFLOAT → DOUBLEVARCHAR(10) → VARCHAR(20)
类型缩窄(通常不安全):
BIGINT → INT(溢出风险)DOUBLE → FLOAT(精度损失)VARCHAR(20) → VARCHAR(10)(截断风险)
最佳实践小结
- 优先使用显式模式:在配置或作业定义阶段显式给出 schema(字段名、类型、nullable、精度),避免完全依赖运行时推断(尤其是"取第一行推断"),后者容易在脏数据或字段漂移时产生不可恢复的问题;
- 选择合适类型:金额/计数等使用
DECIMAL(p,s)/BIGINT精确类型,时间使用DATE/TIME/TIMESTAMP,不要把一切降级为STRING把错误推迟到下游; - 早期验证(快速失败):Source 在 open/prepare 阶段确定 Produced CatalogTable 并完成字段存在性/类型合法性验证,Sink 在作业启动阶段完成输入与目标 schema 的兼容性校验;
- CDC 场景谨慎启用演化:
DROP/RENAME属于高风险操作,生产环境应谨慎开启并做好灰度与回滚预案。
推荐阅读顺序
- 先读本文,建立系统视角;
- 再读 CatalogTable 与元数据管理,了解元数据对象在 source/transform/sink 三端的模式创建、传播与演化细节;
- 再读 Schema 特性简介,掌握全部 schema 配置项与类型声明语法;
- 再读 配置与 Option 系统,理解 schema 配置如何进入 Option 体系;
- 如果预期运行时 schema 会变化,再读 Schema Evolution 配置 与 CDC Pipeline 架构概览。
【免费下载链接】seatunnelSeaTunnel is a multimodal, high-performance, distributed, massive data integration tool.项目地址: https://gitcode.com/GitHub_Trending/se/seatunnel
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考