Skip to main content
 首页 » 数据库

kettle中访问前一行数据

2022年07月19日148over140


kettle中访问前一行数据

     kettle中,当需要访问数据流前一行数据时,很多人都是用javascript步骤的特性;实际上没有必要,不是说javascript步骤不好,主要是性能低,同时也增加了复杂度,因为写代码让javascript步骤难以理解,最好是使用kettle标准步骤实现。我们的原则是代码最小化,过程轻松。

 

The Analytic Query Step)分析查询步骤

     TheAnalytic Query 步骤可以查找数据流中的前面行或后面行,并且取值到当前行,很多场合是非常有用的,但是我感觉通常被开发者忽略。在“statistics”(统计)分类里有该步骤,下面的章节展示如何使用。

 

需求场景:计算库存之和

     假设需要计算数据流中某字段的累计和,如库存和。原始数据是针对每个货物的交易信息,导致库存增加或减少,交易是按照日期排序。需要计算每次交易后当前库存量的值,并作为一个新字段保存,结果如下图所示:

ABC列是输入,列D是通过转换步骤计算出来的。

 

一种解决方法基于“Analytic Query”和“JavaScript modified Value”步骤

     该思路是通过简短的javasript代码去实现,记录当前产品的库存,然后增加交易值,并在新字段中保存结果。如果数据流是按照产品和日期排序,需要针对当前产品增加一个库存计数器,当前产品是新产品(相对前一行),则计数器被置为1,否则为0。通常情况很多人通过javascript代码访问前一行,这种方法并不可取,除了javascript步骤外,还有“Analytic Query”步骤。本例中javascript步骤仅仅根据新字段值判断是否为新的产品,尽量保持javascript步骤简洁,可以减少错误产生。

     这里是解决方法,点击下载:

     首先读取数据并按照产品和日期排序,然后前一行产品值增加到“prev_product”字段中,接下来的步骤是和当前产品进行比较,并把标志值保存在“is_new_product”字段中,后面javascript步骤使用之前的信息计算就变得非常简单了。

     javascript代码如下:

varstock;

  

if(is_new_product ==1){

    stock = 0;

}

  

stock += delta;

为了使结果更直观,最后两个步骤是去除辅助字段并安装日期和产品排序。我们可以通过右击每个步骤,通过查看输出步骤,确认每个步骤的输出字段情况。

 

更简单的方法:无脚步解决方案

     使用“group by”步骤,根据输入分组计算和,在本场景中,比使用“AnalyticQuery”步骤和javascript步骤更有优势。

     无脚步解决方案代码下载

 

 


本文参考链接:https://blog.csdn.net/neweastsun/article/details/39075827
阅读延展