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

时间:2014-01-07 17:26:16

标签: javascript pentaho etl data-warehouse kettle

我正在使用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无法帮助我。

任何解决我问题的想法都会受到赞赏。

4 个答案:

答案 0 :(得分:2)

我可以请你重新考虑分组吗?它似乎适合您的场景。 如果您根据组合日期/商店/文章对流进行排序,则可以计算出售/接收数量的累计总和。通过这种方式,您可以获得可在组基础上重置的库存变化的总计。

同时查看此blog post和论坛帖子的引用。

答案 1 :(得分:1)

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

JavaScript步骤为您提供了极大的灵活性,但如果您可以使用常规转换步骤,它通常会更快。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

谢谢大家,我已经解决了我的问题。

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

all steps of solution

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

首先(显然晚于按product_idstore_iddate升序排序行),我使用Analytic Query步骤按product_id分组{ {1}},因为在此步骤中,我有一个新字段store_id来标识每个组的第一行(previous_date在日期最早的组的行上。{/ p>

analytic query step

然后我需要在第一行(每个组的第一个日期,因为它按日期排序)计算每个组[product,store]的previous_date=null,因为quantity_on_hand对于每个组是不同的。这是因为initial_stock

modified javascript step

最后(并且密钥在这里),我使用(sum(quantity_received) - sum(quantity sold)) != quantity_on_hand步骤,如@andtorg建议,并在下一个图像显示时执行。

group by step

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

非常感谢您的帮助!