집 >데이터 베이스 >MySQL 튜토리얼 >kettle中访问前一行数据
kettle中访问前一行数据 在kettle中,当需要访问数据流前一行数据时,很多人都是用javascript步骤的特性;实际上没有必要,不是说javascript步骤不好,主要是性能低,同时也增加了复杂度,因为写代码让javascript步骤难以理解,最好是使用kettle标准步骤实现
kettle中访问前一行数据
在kettle中,当需要访问数据流前一行数据时,很多人都是用javascript步骤的特性;实际上没有必要,不是说javascript步骤不好,主要是性能低,同时也增加了复杂度,因为写代码让javascript步骤难以理解,最好是使用kettle标准步骤实现。我们的原则是代码最小化,过程轻松。
(The Analytic Query Step)分析查询步骤
TheAnalytic Query 步骤可以查找数据流中的前面行或后面行,并且取值到当前行,很多场合是非常有用的,但是我感觉通常被开发者忽略。在“statistics”(统计)分类里有该步骤,下面的章节展示如何使用。
需求场景:计算库存之和
假设需要计算数据流中某字段的累计和,如库存和。原始数据是针对每个货物的交易信息,导致库存增加或减少,交易是按照日期排序。需要计算每次交易后当前库存量的值,并作为一个新字段保存,结果如下图所示:
A、B、C列是输入,列D是通过转换步骤计算出来的。
一种解决方法基于“Analytic Query”和“JavaScript modified Value”步骤
该思路是通过简短的javasript代码去实现,记录当前产品的库存,然后增加交易值,并在新字段中保存结果。如果数据流是按照产品和日期排序,需要针对当前产品增加一个库存计数器,当前产品是新产品(相对前一行),则计数器被置为1,否则为0。通常情况很多人通过javascript代码访问前一行,这种方法并不可取,除了javascript步骤外,还有“Analytic Query”步骤。本例中javascript步骤仅仅根据新字段值判断是否为新的产品,尽量保持javascript步骤简洁,可以减少错误产生。
这里是解决方法,点击下载:
首先读取数据并按照产品和日期排序,然后前一行产品值增加到“prev_product”字段中,接下来的步骤是和当前产品进行比较,并把标志值保存在“is_new_product”字段中,后面javascript步骤使用之前的信息计算就变得非常简单了。
javascript代码如下:
var stock;
if (is_new_product ==1){
stock = 0;
}
stock += delta;
为了使结果更直观,最后两个步骤是去除辅助字段并安装日期和产品排序。我们可以通过右击每个步骤,通过查看输出步骤,确认每个步骤的输出字段情况。
更简单的方法:无脚步解决方案
使用“group by”步骤,根据输入分组计算和,在本场景中,比使用“AnalyticQuery”步骤和javascript步骤更有优势。
无脚步解决方案代码下载。