我已经建立了一个将数据从mysql db表复制到b mysql表的作业。表列是相同的,除了有时可以在表db中添加新列。
我想从a到b检索所有列,但仅检索表b中存在的那些列。我能够放入表b中存在的查询特定的select colume语句,例如:
select coulmn1,column2,columns3... from table a
问题是,如果我在b中添加与Mysqlinput中的talend作业模式匹配的新列,也应该更改,因为我使用内置类型。
有没有办法在作业运行期间强制模式列?
如果使用的是Talend的预订版本,则可以使用动态列类型。您可以为“动态”类型的输入定义单个列,并将其映射到输出组件中相同类型的列。这将动态地从表a中获取列,并将它们映射到表b中的相同列。这是一个例子。
如果您使用的是Talend Open Studio,那么事情会变得有些棘手,因为Talend希望在设计时定义输入和输出组件的列列表。
这是我汇总来解决此限制的解决方案。
这个想法是列出表b中所有表a的列。然后,在我的示例中id,Theme,name
,将其转换为以逗号分隔的列列表,并将其存储在全局变量中COLUMN_LIST
。tMap的第二个输出构建相同的列列表,但是这次在列之间放置单引号(以便以后可以将它们用作CONCAT
函数的参数),然后将单引号添加到开头和结尾,如下所示:"'", id,"','",Theme,"','",name,"'"
和将其存储在全局变量中CONCAT_LIST
。
在下一个子作业中,我table a
使用CONCAT
函数进行查询,为其提供要连接的列的列表CONCAT_LIST
,从而像这样检索单个列中的每个记录'value1', 'value2',..etc
然后,在最后一个I执行INSERT
对查询table b
,通过指定由全局变量给定列的列表COLUMN_LIST
,并且这些值将被插入作为从所得的单个字符串CONCAT
功能(row6.values
)。
该解决方案是通用的,如果用上下文变量替换表名,则可以使用它来将数据从任何MySQL表复制到另一个表。
我确实使用Talend Open Studio :(
您的表格经常更改结构吗?
您的表a和b是否驻留在不同的数据库中?如果它们在同一个数据库中,我可以建议一个解决方案。
它们是不同的