ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SeaTunnel 多表 Transform(Multi-Table Transform)完整指南:单配置处理多张上游表

SeaTunnel 多表 Transform(Multi-Table Transform)完整指南:单配置处理多张上游表 SeaTunnel 多表 TransformMulti-Table Transform完整指南单配置处理多张上游表【免费下载链接】seatunnelSeaTunnel is a multimodal, high-performance, distributed, massive data integration tool.项目地址: https://gitcode.com/GitHub_Trending/se/seatunnelSeaTunnel 的 Transform 层原生支持多表Multi-Table变换能力当上游插件一次输出多张表如JDBCSource、MySQL-CDC等时你可以在一个 Transform 配置块内为不同表分别配置变换规则并把多张表的规则合并进同一个 Transform统一管理。读完本文你将掌握table_match_regex、table_transform、table_path、rule_match_mode四个核心参数的含义与优先级能够用 Copy 等任意 Transform 以正则批量 单表单条的组合方式完成多表变换并理解其底层匹配与分发实现。一、什么是多表 Transform在 SeaTunnel 中大多数 Source 插件默认输出一张表但部分插件支持一次输出多张表multi-catalog / multi-table例如JDBCSource多表抽取和MySQL-CDC整库/多表变更捕获。当数据流中存在多张表时如果仍使用传统单表 Transform 配置你就需要为每张表分别书写一段 Transform配置冗长且难以维护。多表 TransformMulti-Table Transform正是为解决这个问题而设计的它允许在一个 Transform 配置中同时声明多张表的变换规则由框架按表分发并执行实现一处配置、多表生效。能力边界官方明确说明多表 Transform 对 Transform 的能力没有任何限制任何 Transform 配置都可以用于多表 Transform。多表 Transform 的本质是对数据流中的多张表分别独立处理同时把多张表的 Transform 配置合并到一个 Transform 中便于统一管理。这一点在源码结构上得到了印证seatunnel-transforms-v2中几乎所有 Transform 都提供了对应的*MultiCatalogTransform实现例如CopyCopyFieldMultiCatalogTransformCopyFieldMultiCatalogTransform.javaCalcite SQLCalciteMultiCatalogTransform字段映射FieldMapperMultiCatalogTransform字段过滤FilterFieldMultiCatalogTransform字段加密FieldEncryptMultiCatalogTransform元数据MetadataMultiCatalogTransformLLM / Embedding / Python / DynamicCompile 等均有对应实现它们统一继承自 AbstractMultiCatalogTransform.java共享同一套多表配置与匹配机制。二、多表 Transform 属性Properties多表 Transform 在原有 Transform 参数之上额外增加以下公共参数。这些参数定义在 TransformCommonOptions.java 中对所有支持多表的 Transform 通用名称类型是否必填默认值说明table_match_regexString否.*用于匹配需要做变换的表的正则表达式默认匹配所有表。注意这里匹配的是上游真实表名即 table path不是plugin_output指定的数据集名称。table_transformList否-在table_transform中可以用列表方式为单张表指定变换规则。如果某张表在table_transform中配置了专属规则则外层规则对该表不生效table_transform中的规则优先。table_transform.table_pathString否-在table_transform中为某张表配置规则时必须通过table_path指定表路径。表路径格式为databaseName[.schemaName].tableName采用精确匹配。rule_match_modeString否FIRST_MATCH控制当多条table_transform规则指向完全相同的table_path时的求值方式。可选值FIRST_MATCH与ALL_MATCH。从源码可以看到每个参数的底层定义// seatunnel-transforms-v2/src/main/java/org/apache/seatunnel/transform/common/TransformCommonOptions.java public static final OptionListMapString, Object MULTI_TABLES Options.key(table_transform) .type(new TypeReferenceListMapString, Object() {}) .defaultValue(Collections.emptyList()) .withDescription(The table transform config); public static final OptionString TABLE_PATH Options.key(table_path) .stringType() .noDefaultValue() .withDescription(The table path of catalog table); public static final OptionString TABLE_MATCH_REGEX Options.key(table_match_regex) .stringType() .defaultValue(.*) .withDescription(The regex to match the table path); public static final OptionRuleMatchMode RULE_MATCH_MODE Options.key(rule_match_mode) .enumType(RuleMatchMode.class) .defaultValue(RuleMatchMode.FIRST_MATCH) .withDescription(The rule match mode for table transform config);几点值得注意的源码细节table_transform的默认值为Collections.emptyList()即不配置任何单表规则table_match_regex默认值为.*即默认匹配所有表——这意味着如果你不写任何多表参数多表 Transform 的行为与普通 Transform 一致对每张表都套用外层规则rule_match_mode的默认值是FIRST_MATCH注意与下文未配置时拒绝重复 table_path的行为相区分是否显式配置了该参数行为不同。三、多表匹配逻辑与配置优先级3.1 匹配优先级对每一张表配置的生效优先级为table_transform精确的单表规则 table_match_regex正则批量规则如果某张表既没有命中table_transform中的table_path也不匹配table_match_regex那么该表不应用任何变换数据原样透传。3.2 源码中的匹配流程AbstractMultiCatalogTransform的构造函数完整实现了上述逻辑见 AbstractMultiCatalogTransform.java编译table_match_regex为正则Pattern读取table_transform列表并过滤出含table_path的条目遍历每张输入CatalogTable取出其 table path形如database.schema.table或database.table若存在table_path精确等于该表路径的规则 → 使用该些单表规则否则若table_match_regex能匹配该表路径 → 使用外层Transform 块级配置否则 → 为该表创建 Identity透传Transform不做任何变换。inputCatalogTables.forEach(inputCatalogTable - { String tableId inputCatalogTable.getTableId().toTablePath().toString(); ListReadonlyConfig tableConfigs singleTableConfigs.stream() .filter(c - tableId.equals(c.get(TransformCommonOptions.TABLE_PATH))) .collect(Collectors.toList()); if (!tableConfigs.isEmpty()) { transformMap.put(tableId, buildTransform(inputCatalogTable, selectTableConfigs(tableConfigs, ruleMatchMode))); } else if (tableMatchRegex.matcher(tableId).matches()) { transformMap.put(tableId, buildTransform(inputCatalogTable, Collections.singletonList(config))); } else { transformMap.put(tableId, createIdentityTransform(inputCatalogTable)); } });在运行时数据行会根据其所属表 ID 被分发到对应的内部 Transform。以 Map 类 Transform 为例AbstractMultiCatalogMapTransform.javaOverride public SeaTunnelRow map(SeaTunnelRow row) { if (transformMap.size() 1) { return ((SeaTunnelMapTransformSeaTunnelRow) transformMap.values().iterator().next()).map(row); } return ((SeaTunnelMapTransformSeaTunnelRow) transformMap.get(row.getTableId())).map(row); }即只有一个内部 Transform 时直接复用多表时则按row.getTableId()精确路由到该表对应的变换器。3.3 table_path 精确匹配与 rule_match_modetable_transform.table_path采用精确匹配格式为databaseName[.schemaName].tableName例如test.xyz、mydb.dbo.users。rule_match_mode只控制多条table_transform条目使用了同一个精确table_path这一种情况未配置rule_match_mode配置解析阶段直接拒绝重复的精确table_path条目抛出异常避免歧义FIRST_MATCH按声明顺序应用第一条匹配的table_transform条目ALL_MATCH按声明顺序应用所有匹配的table_transform条目前一条规则对同表的输出会作为下一条规则的输入规则链式叠加。源码中对应的两个方法直观地展示了这一行为// 未配置 rule_match_mode 时拒绝重复 table_path private void rejectDuplicateTablePaths(ListReadonlyConfig tableConfigs) { MapString, Boolean tablePaths new HashMap(); for (ReadonlyConfig tableConfig : tableConfigs) { String tablePath tableConfig.get(TransformCommonOptions.TABLE_PATH); if (tablePaths.put(tablePath, true) ! null) { throw new IllegalStateException(String.format( Duplicate table_transform rules are configured for table_path [%s], tablePath)); } } } // FIRST_MATCH 取第一条ALL_MATCH 取全部 private ListReadonlyConfig selectTableConfigs( ListReadonlyConfig tableConfigs, TransformCommonOptions.RuleMatchMode ruleMatchMode) { if (ruleMatchMode TransformCommonOptions.RuleMatchMode.FIRST_MATCH) { return Collections.singletonList(tableConfigs.get(0)); } return tableConfigs; }对于ALL_MATCH模式多个规则会按顺序逐个构建 Transform 并串成链ChainedMapTransform前一规则的输出表结构getProducedCatalogTable()会成为下一规则的输入结构for (ReadonlyConfig config : configs) { SeaTunnelTransformSeaTunnelRow transform buildTransform(currentCatalogTable, config); transforms.add(transform); currentCatalogTable transform.getProducedCatalogTable(); }四、完整示例一个 Copy Transform 处理五张表4.1 场景假设假设上游一次性读取了五张结构相同的表test.abc、test.abcd、test.xyz、test.xyzxyz、test.www每张表都有三个字段id、name、age。我们希望通过 Copy Transform 复制这些表的数据具体要求如下对test.abc和test.abcd将name字段复制到新字段name1对test.xyz将name字段复制到name2对test.xyzxyz将name字段复制到name3对test.www不做任何变换。4.2 一个配置搞定多张表transform { Copy { plugin_input fake // 可选指定读取的数据集名称 plugin_output fake1 // 可选指定输出的数据集名称 table_match_regex test.a.* // 1. 匹配需要变换的表这里命中 test.abc 和 test.abcd src_field name // 源字段 dest_field name1 // 目标字段 table_transform [{ table_path test.xyz // 2. 指定要变换的表名 src_field name // 源字段 dest_field name2 // 目标字段 }, { table_path test.xyzxyz src_field name dest_field name3 }] } }4.3 配置解读通过正则test.a.*及对应的 Copy 参数命中test.abc和test.abcd将name复制为name1通过table_transform为test.xyz单独指定规则将name复制为name2同理为test.xyzxyz将name复制为name3test.www既不匹配正则也没有table_transform规则因此不应用任何变换。这样我们就在一个 Transform 配置内完成了多张表的变换处理。关于src_field/dest_field从 CopyTransformConfig.java 源码看src_field与dest_field属于已标记Deprecated的旧式写法推荐的新写法是使用fields映射例如fields { name name1 }一次可声明多组字段复制关系。二者在CopyTransformConfig.of()中会统一归一化为LinkedHashMapString, String fields。多表示例中为了直观展示每张表一套规则的写法仍沿用旧式参数实际生产配置建议优先使用fields。4.4 各表实际生效的配置与输出结构test.abc 与 test.abcd外层规则transform { Copy { src_field name dest_field name1 } }输出结构| id | name | age | name1 |test.xyztable_transform 精确规则transform { Copy { src_field name dest_field name2 } }输出结构| id | name | age | name2 |test.xyzxyztable_transform 精确规则transform { Copy { src_field name dest_field name3 } }输出结构| id | name | age | name3 |test.www无规则命中透传transform { // 无需任何变换 }输出结构| id | name | age |4.5 优先级再确认以上示例再次印证了优先级规则test.abc/test.abcd虽然也在table_transform规则之外但它们命中外层table_match_regex因此应用外层规则而test.xyz/test.xyzxyz命中了table_transform中的精确table_path外层规则对它们不生效各自应用专属规则test.www两类规则均未命中原样输出。五、rule_match_mode 实战ALL_MATCH 链式变换当多条table_transform条目指向同一个table_path时可用rule_match_mode控制求值方式。下面的配置在ALL_MATCH模式下先对test.xyz把name复制为name2再对同一张表把name2复制为name3transform { Copy { rule_match_mode ALL_MATCH table_transform [{ table_path test.xyz src_field name dest_field name2 }, { table_path test.xyz src_field name2 dest_field name3 }] } }输出结构| id | name | age | name2 | name3 |这里前一条规则name→name2的输出字段name2成为后一条规则name2→name3的输入两条规则按声明顺序链式执行。需要注意的边界情况如果不配置rule_match_mode上述两条规则指向同一 table_path的配置会在配置解析阶段直接报错Duplicate table_transform rules are configured for table_path [test.xyz]这是源码 AbstractMultiCatalogTransform.java 中rejectDuplicateTablePaths的强制校验FIRST_MATCH模式则只取声明顺序中的第一条规则第二条会被忽略。六、其他 Transform 的多表用法多表 Transform 的能力不仅限于 Copy。本文示例使用的是 Copy Transform但 SeaTunnel 中所有 Transform 都支持多表变换你只需在对应 Transform 的配置块中按照同样的方式书写table_match_regex、table_transform等参数即可。例如对字段过滤Filter、字段加密Encrypt、SQLCalcite、元数据提取Metadata等 Transform多表配置结构与本文完全一致——它们各自的*MultiCatalogTransform实现均继承自AbstractMultiCatalogTransform共享同一套参数解析与匹配机制。可以参考 seatunnel-transforms-v2 模块下的实现以及 transforms 文档目录 中各 Transform 的详细参数说明。七、小结要点说明适用场景上游一次输出多张表如JDBCSource、MySQL-CDC时在一个 Transform 内统一配置变换批量规则table_match_regex用正则匹配表路径默认.*匹配全部匹配的是真实上游表名单表规则table_transformtable_pathdatabase[.schema].table精确匹配为单表定制规则优先级table_transformtable_match_regex均未命中则透传同表多规则不配rule_match_mode会拒绝重复table_pathFIRST_MATCH取第一条ALL_MATCH链式叠加适用范围所有 Transform 均支持能力不受限配置多个多表规则时建议遵循能用正则批量覆盖的场景用table_match_regex需要为个别表定制差异规则时用table_transform同时注意同一表路径的多规则必须显式声明rule_match_mode为ALL_MATCH或FIRST_MATCH避免配置解析失败。【免费下载链接】seatunnelSeaTunnel is a multimodal, high-performance, distributed, massive data integration tool.项目地址: https://gitcode.com/GitHub_Trending/se/seatunnel创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表