循环在水壶变换中

时间:2013-04-08 11:16:39

标签: pentaho kettle

我想重复执行一个如下所示的SQL查询:

SELECT '${date.i}' AS d, 
  COUNT(DISTINCT xid) AS n
FROM table 
WHERE date 
  BETWEEN DATE_SUB('${date.i}', INTERVAL 6 DAY) 
    AND '${date.i}'
;

它基本上是按时间跨度分组,只是那些相交,这会阻止使用GROUP BY。

这就是为什么我想在某个时间跨度内每天重复执行查询的原因。但我不确定如何实现循环。你会建议什么解决方案?

Kettle变量date.i从全局变量初始化。转换只是同一转换包中的几个转换之一。只要不重新进入循环,就可以隐含地实现“停止trafo”。

以下是流程图:

enter image description here

2 个答案:

答案 0 :(得分:4)

转型的流程:

enter image description here

在步骤" INPUT"我创建了一个包含三个相同字段的结果集,其日期从${date.from}${date.until}(水壶变量)。 (有关此技术的详细信息,请查看我的文章 - Generating virtual tables for JOIN operations in MySQL)。

在步骤" SELECT"我设置了要使用的数据源(" INPUT")并且我想要" SELECT"要为服务结果集中的每一行执行。因为Kettle通过一个不露面的问号将参数1对1映射,所以我必须为相同的参数提供三次 - 每次使用。

"文本文件输出"最后以一般的方式输出结果。只需要设置文件名。

2013-01-01至2013-01-05的结果文本输出内容:

d;n
2013/01/01 00:00:00.000;3038
2013/01/02 00:00:00.000;2405
2013/01/03 00:00:00.000;2055
2013/01/04 00:00:00.000;2796
2013/01/05 00:00:00.000;2687

我不确定这是否是最简单的解决方案,但它可以解决问题。


enter image description here

答案 1 :(得分:1)

在水壶中你想避免循环,它们会在变换中造成真正的麻烦。相反,您应该通过添加一个步骤来执行此操作,该步骤将在流中为您想要的每个日期放置一行(将值存储在字段中),然后在查询中使用该字段值。

ETA:流是在步骤之间移动行(记录)的东西。可能有助于将其视为由每个跃点处的表组成,该表临时保存步骤之间的行。

您希望避免循环,因为Kettle变换仅在行级别是顺序的:行可以并行处理并且不按顺序处理,唯一的保证是该行将按顺序通过这些步骤。因此,变换中的循环不会像您直观期望的那样起作用。

仅供参考,如果您仍然不清楚流是什么,这听起来似乎您可能需要阅读一些Kettle教程。