Home  >  Article  >  Database  >  kettle中访问前一行数据

kettle中访问前一行数据

WBOY
WBOYOriginal
2016-06-07 16:01:281569browse

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步骤更有优势。

\

无脚步解决方案代码下载

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn