如何从 Pentaho 的 javascript 步骤中的另一行读取?

Posted

技术标签:

【中文标题】如何从 Pentaho 的 javascript 步骤中的另一行读取?【英文标题】:How to read from another row in javascript step of Pentaho? 【发布时间】:2014-01-07 17:26:16 【问题描述】:

我正在使用 Pentaho 数据集成(Spoon,在 Kettle 之前)进行 ETL 流程。

在 Pentaho 的 Modified javascript 步骤中,您可以设置开始、结束和转换脚本。在转换脚本中,您可以编写仅对每一行执行的代码,并且从这里我不知道如何访问前一行的数据(如果可能的话)。

我需要访问上一行,因为所有行都按产品、商店和日期(分别)排序,目标是从上一行获取手头数量并添加销售或接收的数量当前行(这将是相同的产品,相同的商店,但不同的日期)。我还需要访问上一行以将当前行的产品和商店与上一行进行比较,因为如果其中有人更改,我必须重新启动字段 quantity_on_hand (我使用名为 initial_stock 的所有列的字段来执行此操作)。

在伪代码上会是这样的(如果我没有限制在步骤上编写的代码仅针对每一行执行):

while(all_rows_processed())

    current_row.quantity_on_hand = current_row.initial_stock;

    while(id_product_current_row == id_product_previous_row && id_store_current_row == id_store_previous_row)

        current_row.quantity_on_hand = previous_row.quantity_on_hand + current_row.stock_variation;
    

这个question related 帮不了我。

任何解决我问题的想法都将不胜感激。

【问题讨论】:

【参考方案1】:

我可以请您重新考虑 Group By step 吗?它似乎适合您的场景。 如果您根据您的组合日期/商店/文章对流进行排序,您可以计算销售/接收数量的累积总和。通过这种方式,您可以获得一个可以按组重置的运行总库存变化。

还可以查看此blog post 和论坛帖子中的引用。

【讨论】:

感谢您的回复!我也在尝试使用 Group By Step 来做这件事,但我认为它不能解决我的问题。我不想只计算销售/收到数量的累积总和,因为每个产品都有自己的 initial_stock,如果我汇总销售和收到的数量,它就不正确。【参考方案2】:

我怀疑您是否需要为此使用 JavaScript。查看Analytic query 步骤。这将允许您将前一行的值带入当前行。

JavaScript 步骤为您提供了极大的灵活性,但如果您可以使用常规转换步骤来做到这一点,它通常会快得多。

【讨论】:

感谢您的回复!我正在尝试结合分析查询和修改后的 Javascript 步骤来解决我的问题,因为我认为只有其中一个是不可能的。【参考方案3】:

使用分析查询。通过使用此步骤,您可以访问上一条/下一条记录。实际上,您不仅可以阅读上一条和下一条记录,还可以阅读 N Rows Fordward 或 N Rows Back Wards。

检查以下 URL 以获得更清晰的解释:

    http://wiki.pentaho.com/display/EAI/Analytic+Query http://www.nicholasgoodman.com/bt/blog/2009/01/30/the-death-of-prevrow-rowclone/

【讨论】:

【参考方案4】:

谢谢大家,我已经找到了解决问题的方法。

我综合了您的所有建议,并使用了Analytic QueryModified JavascriptGroup by 步骤。

虽然问题的表述不是很好,但我遇到的问题是计算每一行的库存水平(每种产品、日期和商店组合都有一行)。

首先(显然晚于按product_idstore_iddate 升序对行进行排序),我使用Analytic Query 步骤按product_idstore_id 分组,因为通过这一步我已经获得了一个新字段 previous_date 来标识每个组的第一行(previous_date=null 在日期最早的组的行上)。

然后我需要在第一行(每个组的第一个日期,因为它按日期排序)计算每个组 [product,store] 的 quantity_on_hand,因为每个组的 initial_stock 不同。这是因为(sum(quantity_received) - sum(quantity sold)) != quantity_on_hand

最后(关键就在这里),我按照@andtorg 的建议使用了Group by 步骤,并按照下图所示进行操作。

@andtorg 建议的这个link 非常有用。它甚至包括两个.ktr 示例文件。

非常感谢您的帮助!

【讨论】:

以上是关于如何从 Pentaho 的 javascript 步骤中的另一行读取?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 pentaho 中的 rest 服务创建仪表板?

如何从命令行运行 pentaho 作业

如何使用 pentaho 水壶查看 http 标头

如何从 Pentaho xaction 输出 JSON?

如何配置Pentaho Carte集群

通过查询填充下拉框并将内容用作链接参数(Pentaho)