温馨提示:本文翻译自stackoverflow.com,查看原文请点击:mysql - How to Guess schema in Mysqlinput on the fly in Talend
jobs mysql schema talend

mysql - 如何在Talend中即时猜测Mysqlinput中的模式

发布于 2020-04-21 12:33:57

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

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

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

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

有没有办法在作业运行期间强制模式列?

查看更多

提问者
Itay Regev
被浏览
9
Ibrahim Mezouar 2018-01-18 01:52

如果使用的是Talend的预订版本,则可以使用动态列类型。您可以为“动态”类型的输入定义单个列,并将其映射到输出组件中相同类型的列。这将动态地从表a中获取列,并将它们映射到表b中的相同列。这是一个例子
如果您使用的是Talend Open Studio,那么事情会变得有些棘手,因为Talend希望在设计时定义输入和输出组件的列列表。

这是我汇总来解决此限制的解决方案。

在此处输入图片说明

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

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

然后,在最后一个I执行INSERT对查询table b,通过指定由全局变量给定列的列表COLUMN_LIST,并且这些值将被插入作为从所得的单个字符串CONCAT功能(row6.values)。

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