我已经构建了一个将数据从mysql db表复制到b mysql表的作业。 表列是相同的,除非有时可以在表中添加新列。
我想从a到b检索所有列,但只检索表b中存在的列。我能够在表b中存在查询特定的选择colume语句,如:
select coulmn1,column2,columns3... from table a
问题是如果我在b中添加一个与mysqlinput中的talend作业模式匹配的新列,也应该更改,因为我使用build in type。
有没有办法在作业运行期间强制架构列?
答案 0 :(得分:5)
如果您使用的是Talend的订阅版本,则可以使用动态列类型。您可以为类型"动态"的输入定义单个列。并将其映射到输出组件中相同类型的列。这将从表a动态获取列并将它们映射到表b中的相同列。这是一个example 如果您正在使用Talend Open Studio,那么事情会变得有点棘手,因为Talend需要在设计时定义输入和输出组件的列列表。
这是我解决这个限制的解决方案。
想法是列出表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表复制到另一个表。