跳到主要内容
版本:Next

Transform的多表转换

SeaTunnel transform支持多表转换,在上游插件输出多个表的时候特别有用,能够在一个transform中完成所有的转换操作。目前SeaTunnel很多Connectors支持多表输出,比如JDBCSourceMySQL-CDC 等。所有的Transform都可以通过如下配置实现多表转换。

提示

多表Transform没有对Transform能力的限制,任何Transform的配置都可以在多表Transform中使用。多表Transform的作用针对数据流中的多个表进行单独的处理,并将多个表的Transform配置合并到一个Transform中,方便用户管理。

属性

NameTypeRequiredDefaultDescription
table_match_regexStringNo.*表名的正则表达式,通过正则表达式来匹配需要进行转换的表,默认匹配所有的表。注意这个表名是上游的真正表名,不是result_table_name。
table_transformListNo-可以通过table_transform列表来指定部分表的规则,当在table_transform中配置某个表的转换规则后,外层针对当前表的规则不会生效,以table_transform中的为准
table_transform.table_pathStringNo-当在table_transform中配置某个表的转换规则后,需要使用table_path字段指定表名,表名需要包含databaseName[.schemaName].tableName

匹配逻辑

假设我们从上游读取了5张表,分别为test.abctest.abcdtest.xyztest.xyzxyztest.www。他们的表结构一致,都有idnameage三个字段。

| id | name | age |

现在我们想通过Copy transform将这5张表的数据进行复制,具体需求是,test.abctest.abcd表需要将name复制为name1test.xyz表需要复制为name2test.xyzxyz表需要复制为name3test.www数据结构不变。那么我们可以通过如下配置来实现:

transform {
Copy {
source_table_name = "fake" // 可选的读取数据集名
result_table_name = "fake1" // 可选的输出数据集名

table_match_regex = "test.a.*" // 1. 通过正则表达式匹配需要进行转换的表,test.a.*表示匹配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"
}]
}
}

解释

  1. 通过第一层的正则表达式,和对应的Copy transform options配置,我们可以匹配到test.abctest.abcd表,将name字段复制为name1
  2. 通过table_transform配置,我们可以指定test.xyz表,将name字段复制为name2

这样我们就可以通过一个transform完成对多个表的转换操作。

对于每个表来说,配置的优先级是:table_transform > table_match_regex。如果所有的规则都没有匹配到,那么该表将不会进行任何转换操作。

针对每个表来说,他们的Transform配置是:

  • test.abctest.abcd
transform {
Copy {
src_field = "name"
dest_field = "name1"
}
}

输出表结构:

| id | name | age | name1 |

  • test.xyz
transform {
Copy {
src_field = "name"
dest_field = "name2"
}
}

输出表结构:

| id | name | age | name2 |

  • test.xyzxyz
transform {
Copy {
src_field = "name"
dest_field = "name3"
}
}

输出表结构:

| id | name | age | name3 |

  • test.www
transform {
// 无需转换
}

输出表结构:

| id | name | age |

我们使用了Copy Transform作为了示例,实际上所有的Transform都支持多表转换,只需要在对应的Transform中配置即可。