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

Ita*_*gev 0 mysql schema jobs talend

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

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

select coulmn1,column2,columns3... from table a
Run Code Online (Sandbox Code Playgroud)

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

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

Ibr*_*uar 5

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

这是我一起解决这个限制的解决方案.

在此输入图像描述

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

在下一个subjob上,我table a使用该CONCAT函数进行查询,为其提供要连接的列的列表CONCAT_LIST,从而检索单个列中的每个记录,如此'value1', 'value2',..etc

然后,我最后通过指定全局变量给出的列列表,以及要作为函数()生成的单个字符串插入的值来执行INSERT查询.table bCOLUMN_LISTCONCATrow6.values

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