mysql - 如何在 Talend 中动态猜测 Mysqlinput 中的模式

标签 mysql schema talend jobs

我构建了一个作业,将数据从 mysql db 表复制到 b mysql 表。 表列是相同的,除了有时可以在表 a 数据库中添加新列。

我想检索从 a 到 b 的所有列,但只检索存在于表 b 中的列。我能够放入表 b 中存在的特定于查询的 select colume 语句,例如:

select coulmn1,column2,columns3... from table a

问题是,如果我在 b 中添加一个与 Mysqlinput 中的 talend 作业模式匹配的新列,那么也应该更改,因为我使用的是内置类型。

有没有办法在作业运行期间强制使用架构列?

最佳答案

如果您使用的是订阅版 Talend,则可以使用动态列类型。您可以为“动态”类型的输入定义一个列,并将其映射到输出组件中相同类型的列。这将从表 a 动态获取列并将它们映射到表 b 中的相同列。这是一个 example .
如果您使用的是 Talend Open Studio,事情会变得有点棘手,因为 Talend 需要一个需要在设计时定义的输入和输出组件的列列表。

这是我为解决此限制而整理的解决方案。

enter image description here

想法是列出表 b 中存在的表 a 的所有列。然后将其转换为逗号分隔的列列表,在我的示例中为 id,Theme,name 并将其存储在全局变量 COLUMN_LIST 中。 tMap 的第二个输出构建了相同的列列表,但这次在列之间放置了单引号(以便稍后可以将它们用作 CONCAT 函数的参数),然后将单引号添加到开始和结束,像这样: "'", id,"','",Theme,"','",name,"'" 并将其存储在全局变量 CONCAT_LIST

在下一个子作业中,我使用 CONCAT 函数查询 表 a,为它提供要连接的列列表 CONCAT_LIST,因此像这样检索单个列中的每条记录 'value1', 'value2',..etc

最后,我通过指定全局变量 COLUMN_LIST 给出的列列表,对 表 b 执行了一个 INSERT 查询,并且要作为 CONCAT 函数生成的单个字符串插入的值 (row6.values)。

此解决方案是通用的,如果您将表名替换为上下文变量,则可以使用它将数据从任何 MySQL 表复制到另一个表。

关于mysql - 如何在 Talend 中动态猜测 Mysqlinput 中的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48250350/

相关文章:

php - Mysql 查询问题。授予用途*。 * 给用户

sql - 在没有 pg_lang 条目的情况下在 Postgresql 中查找存储过程语言的策略

java.lang.IllegalArgumentException : No SchemaFactory that implements the schema language specified 异常

java - 如何正确定义运行时加载的类的函数参数?

mysql - MySQL 存储过程中是否有任何列表数据类型或模拟它们的方法?

PHP表单更新多个mysql行

mysql - 合并两个表的输出具有相同的结构

sql - 如何避免数据库中出现 NULL,同时还代表缺失数据?

java - 在一条语句中用新值替换空字段、null 字段和纯空白字段

java - 在 Talend 路由中使用特定版本的 Bean