tMySqlInput中的TOS DI变量

时间:2014-07-28 14:29:04

标签: mysql talend

我对Talend OSDI相对较新。我设法在MySql中使用 tMySqlInput 组件执行简单请求。然而今天我有一个更雄心勃勃的要求,并且有一些麻烦使它成功。 实际上我需要一个请求,其结果取决于前一行。我是在MySQLWorkbench上创建的,但在Talend上没有。例子:两个日期之间的延迟时间。 这是请求:

SET @var = NULL;
SELECT id, start_date, end_date, @var precedent, UNIX_TIMESTAMP(TIMEDIFF(start_date,@var)) AS diff, @var:=start_date AS temp
FROM ma_table
ORDER BY start_date;

并且错误是:

  • 您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以获得正确的语法,以便在SELECT id,start_date,end_date,id_process_type,@ var precedent,UNIX_TIMESTAMP'附近使用。在第2行

...不是很有用,Talend上禁止使用这种语法吗?是否存在其他解决方案在Talend上执行此类请求? (例如,两个日期之间的延迟时间)或其他组件可能?我正在使用tMysqlRow进行搜索。

感谢您的想法!

2 个答案:

答案 0 :(得分:2)

你应该考虑使用一个语句重构来以“Talend”的方式进行,可能会慢一点但是最便携和健壮。

例如,如果您的表不是很大,我建议使用tCacheOutput / tCacheInput将其加载到内存中(您可以在Talend Exchange上找到它们)和此设计:

    tMySqlLoad----->tCacheOutput_1
        |
        |
        |            
    OnSubjobOk        
        |
        |
        v
  tCacheInput_1------->tMap_1--------+
                                     |
                                     |
                                   tJoin-------------->tMap_3------------>[output]
                                     |
                                     |
  tCacheInput_2------->tMap_2--------'
  1. 首先,将表转储到内存缓冲区
  2. 然后,你读了两次这个缓冲区。这是在记忆中,所以它不会伤害表演
  3. 在tMap_1中,使用Numeric.sequence
  4. 添加auto_increment索引
  5. 您在tMap_2中执行相同的操作,但起始编号为2(基本上,您可以移动索引)
  6. 然后使用这些全新的列
  7. 自动加入表格
  8. 最后在tMap_3中你将释放你的有效载荷(即制作差异)
  9. 如果您的桌子很小,这将是一个冗长而强大的解决方案。如果不是,性能不是问题,您可以尝试更加详细的解决方案,如Prepared Statements

答案 1 :(得分:2)

正如@Gabriele B提到的那样,您可能需要考虑在更多" Talend"方式。

我亲自使用tMemorizeRows组件来执行此操作。

Job layout

为了简化这一点,我已经离开并将开始日期和结束日期视为整数,但使用正确的日期来处理这一点应该是微不足道的。

Sample data

如果我们有一些数据显示进程的开始和结束日期,并且我们想要计算完成最后一个进程和开始下一个进程之间的延迟,我们可以读取所有数据,然后使用tMemorizeRows组件记住最后两行:

tMemorizeRows component configuration

然后我们通过查看数组索引来访问存储的数据。所以这里我们转到一个tJavaRow组件,它有一个额外的输出列startdelay。然后我们通过比较当前流程来计算它。开始日减去最后一个过程'结束日期:

output_row.id = input_row.id;
output_row.startdate = input_row.startdate;
output_row.enddate = input_row.enddate; 
if (id_tMemorizeRows_1[0] != 1) {
    output_row.startDelay = startdate_tMemorizeRows_1[0] - enddate_tMemorizeRows_1[1];
} else {
    output_row.startDelay = 0;
}

条件语句它在第一次运行数据时避免空指针错误,因为enddate_tMemorizeRows_1[1]在该点将为空。当然,您可以通过其他方式处理null。

这个过程相当容易理解和维护(虽然那里有一小部分Java代码)并且具有只需要加载数据一次的好处,并且只保留一小部分内存中的任何一个时间。它也应该非常快。