我构建了一个将数据从mysql db表复制到mysql表的作业。表列是相同的,只是有时可以在表db中添加一个新列。
我想检索从a到b的所有列,但只检索表b中存在的列。我能够将表b中存在的查询特定的select colume语句放入其中,如下所示:
select coulmn1,column2,columns3... from table a
问题是,如果我在b中添加一个与a匹配的新列,那么mysqlinput中的talend作业模式也应该更改,因为我使用的是内置类型。
有没有办法在作业运行期间强制架构列?
1条答案
按热度按时间y1aodyip1#
如果您使用的是talend的订阅版本,则可以使用动态列类型。您可以为“dynamic”类型的输入定义一个列,并将其Map到输出组件中相同类型的列。这将动态地从表a中获取列,并将它们Map到表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
最后我执行了一个INSERT
查询table b
,通过指定全局变量给定的列列表COLUMN_LIST
,以及要作为单个字符串插入的值CONCAT
功能(row6.values
).此解决方案是通用的,如果用上下文变量替换表名,则可以使用它将数据从任何mysql表复制到另一个表。