我对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;
并且错误是:
...不是很有用,Talend上禁止使用这种语法吗?是否存在其他解决方案在Talend上执行此类请求? (例如,两个日期之间的延迟时间)或其他组件可能?我正在使用tMysqlRow进行搜索。
感谢您的想法!
答案 0 :(得分:2)
你应该考虑使用一个语句重构来以“Talend”的方式进行,可能会慢一点但是最便携和健壮。
例如,如果您的表不是很大,我建议使用tCacheOutput / tCacheInput将其加载到内存中(您可以在Talend Exchange上找到它们)和此设计:
tMySqlLoad----->tCacheOutput_1
|
|
|
OnSubjobOk
|
|
v
tCacheInput_1------->tMap_1--------+
|
|
tJoin-------------->tMap_3------------>[output]
|
|
tCacheInput_2------->tMap_2--------'
Numeric.sequence
如果您的桌子很小,这将是一个冗长而强大的解决方案。如果不是,性能不是问题,您可以尝试更加详细的解决方案,如Prepared Statements。
答案 1 :(得分:2)
正如@Gabriele B提到的那样,您可能需要考虑在更多" Talend"方式。
我亲自使用tMemorizeRows组件来执行此操作。
为了简化这一点,我已经离开并将开始日期和结束日期视为整数,但使用正确的日期来处理这一点应该是微不足道的。
如果我们有一些数据显示进程的开始和结束日期,并且我们想要计算完成最后一个进程和开始下一个进程之间的延迟,我们可以读取所有数据,然后使用tMemorizeRows组件记住最后两行:
然后我们通过查看数组索引来访问存储的数据。所以这里我们转到一个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代码)并且具有只需要加载数据一次的好处,并且只保留一小部分内存中的任何一个时间。它也应该非常快。