如何从 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 Query
、Modified Javascript
和Group by
步骤。
虽然问题的表述不是很好,但我遇到的问题是计算每一行的库存水平(每种产品、日期和商店组合都有一行)。
首先(显然晚于按product_id
、store_id
和date
升序对行进行排序),我使用Analytic Query
步骤按product_id
和store_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 步骤中的另一行读取?的主要内容,如果未能解决你的问题,请参考以下文章