如何在talend中动态猜测mysqlinput中的模式

4szc88ey  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(327)

我构建了一个将数据从mysql db表复制到mysql表的作业。表列是相同的,只是有时可以在表db中添加一个新列。
我想检索从a到b的所有列,但只检索表b中存在的列。我能够将表b中存在的查询特定的select colume语句放入其中,如下所示:

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

问题是,如果我在b中添加一个与a匹配的新列,那么mysqlinput中的talend作业模式也应该更改,因为我使用的是内置类型。
有没有办法在作业运行期间强制架构列?

y1aodyip

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表复制到另一个表。

相关问题