gpt4 book ai didi

mysql - tMySqlInput 中的 TOS DI 变量

转载 作者:太空宇宙 更新时间:2023-11-03 10:51:08 25 4
gpt4 key购买 nike

我对 Talend OSDI 比较陌生。我设法使用 tMySqlInput 组件在 MySql 中执行简单请求。但是今天我有一个更雄心勃勃的要求,并且很难让它发挥作用。事实上,我需要一个请求,其结果取决于上一行。我是在 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 服务器版本对应的手册,了解在第 2 行的“SELECT id、start_date、end_date、id_process_type、@var precedent、UNIX_TIMESTAMP”附近使用的正确语法

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

谢谢你的想法!

最佳答案

作为@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 代码)并且具有只需要加载一次数据并且每次只将一小部分数据保留在内存中的好处时间。它也应该非常快。

关于mysql - tMySqlInput 中的 TOS DI 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24997520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com