如何在Talend

时间:2018-01-14 14:04:26

标签: mysql schema talend jobs

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

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

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

问题是如果我在b中添加一个与mysqlinput中的talend作业模式匹配的新列,也应该更改,因为我使用build in type。

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

1 个答案:

答案 0 :(得分:5)

如果您使用的是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中。

在下一个subjob上,我使用table a函数查询CONCAT,为其提供要连接的列的列表CONCAT_LIST,从而检索单个列中的每条记录,如此{ {1}}

然后我最后通过指定全局变量'value1', 'value2',..etc给出的列列表,以及要作为单个字符串结果插入的值,对INSERT执行table b查询来自COLUMN_LIST函数(CONCAT)。

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