Pentaho 水壶变换中的循环

Pentaho 水壶变换中的循环,pentaho,kettle,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}' ; 它基本上是按时间跨度分组的,只是这些时间跨度是相交的,这就阻止了使用GROUPBY 这就是为什么我希望在特定的时间跨度内每天重复执行查询。但我不确定应该如何实现循环。

我想重复执行如下所示的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}'
;
它基本上是按时间跨度分组的,只是这些时间跨度是相交的,这就阻止了使用GROUPBY

这就是为什么我希望在特定的时间跨度内每天重复执行查询。但我不确定应该如何实现循环。你有什么建议

釜变量date.i是从全局变量初始化的。该转换只是同一个转换包中的几个转换之一。“stop-trafo”可以通过不重新进入循环来隐式实现

以下是流程图:


在水壶中,您希望避免循环,它们可能会在转换中造成真正的麻烦。相反,您应该添加一个步骤,在流中为您想要的每个日期放置一行(值存储在字段中),然后在查询中使用该字段值

ETA:流是在步骤之间移动行(记录)的东西。可以将其视为在每个跃点处包含一个表,该表在各个步骤之间临时保存行

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


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

在壶穴中,您希望避免循环,它们可能会在转换中造成真正的麻烦。相反,您应该添加一个步骤,在流中为您想要的每个日期放置一行(值存储在字段中),然后在查询中使用该字段值

ETA:流是在步骤之间移动行(记录)的东西。可以将其视为在每个跃点处包含一个表,该表在各个步骤之间临时保存行

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


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

转换流:

在步骤“输入”中,我创建了一个结果集,其中包含三个相同的字段,将日期从
${date.from}
保留到
${date.until}
(釜变量)。(有关此技术的详细信息,请参阅我的文章-)

在步骤“选择”中,我设置要使用的数据源(“输入”),并且我希望对服务结果集中的每一行执行“选择”。因为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
我不确定这是否是最巧妙的解决方案,但它确实奏效了



转换流程:

在步骤“输入”中,我创建了一个结果集,其中包含三个相同的字段,将日期从
${date.from}
保留到
${date.until}
(釜变量)。(有关此技术的详细信息,请参阅我的文章-)

在步骤“选择”中,我设置要使用的数据源(“输入”),并且我希望对服务结果集中的每一行执行“选择”。因为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
我不确定这是否是最巧妙的解决方案,但它确实奏效了