【发布时间】:2018-05-25 05:25:41
【问题描述】:
使用 Talend 对数据集执行 ETL,我获得了“yyyyMM”列作为“MonthYear”,以及该月的总“CB”。
现在,我想找出每个月过去 3 个月的总 CB。
各自的(自连接)查询:
SELECT
t1.MonthYear, t1.CB
SUM(t2.CB) CB_last3months
FROM
Table1 t1
JOIN Table1 t2
ON t2.MonthYear <= t1.MonthYear
AND t2.MonthYear >= t1.MonthYear-2
GROUP BY t1.Month
我的数据是这样的:
MonthYear CB
-------+-------
201601 7000
201602 5000
201603 7000
201604 6000
201605 7000
201606 4000
我希望我的输出架构是这样的:
MonthYear CB CB_last3months
------+-------+-------------------
201601 7000 7000
201602 5000 12000
201603 7000 19000
201604 6000 18000
201605 7000 20000
201606 4000 17000
在 SQL 中,我可以通过嵌套子查询或使用自联接来做到这一点。如何在当前 Talend 作业 上执行此查询,而无需将行作为表存储在 (MySQL) 数据库中?
我的另一个选择是使用 Talend 组件来执行剩余的步骤。
但是 Talend 中是否有任何组件可以迭代地提取行并对它们执行聚合?或者在 tMap 中执行连接和聚合的某种方式?
到目前为止,我已经尝试过这个......但是如何让“测试”表达式被迭代评估?
tMap 组件表达式
【问题讨论】:
-
这不是您在 Talend 中应该做的事情。您应该将此操作下推到数据库。
-
@Kermit 谢谢,这是我在 Talend 工作两周以来的推测。简单的 ETL 显然无法在此工具中执行……那么 Talend 究竟可以做到什么级别的 ETL,而其他数据科学/工程工具却无法做到呢?除了连接和推送到众多数据库。您是否有提及 Talend 的确切用例和限制的链接?
-
这是简单的优化,不是工具的错。您正在尝试将数据库操作推送到 ETL 工具中(无论工具是什么)。 Talend 可以做到这一点,但您需要使用
tMemorizeRows来完成您的任务,即便如此,它也会比在数据库中执行它要慢得多(应该如何)。您是在评估 Talend 还是您的最终目标是什么? -
我试图弄清楚它可以实际用于什么,并为每个组件找到用例。大多数情况下,我发现它最适合数据迁移。你能分享一下
tMemorizeRows在这里如何使用吗? -
这是个人评价还是您有正在从事的项目?有一些关于使用
tMemorizeRows的各种用例的博客:Calculating an expiration date 和 Aggregated child data。它的目的是存储之前的数据以进行计算/聚合。
标签: talend