Pentaho 数据集成 setVariable 和 getVariable 问题

Posted

技术标签:

【中文标题】Pentaho 数据集成 setVariable 和 getVariable 问题【英文标题】:Pentaho Data Integration setVariable and getVariable issue 【发布时间】:2018-09-19 02:05:10 【问题描述】:

我的工作是在一行中进行以下转换:

1) 开始

2) 计算变量

3) 使用变量

calculate_variables 转换

这个转换有 3 个步骤:

第 1 步:Table input”步骤从数据库中读取单个值 my_date

第 2 步:Add constant values”步骤声明了一个日期常量 some_date

步骤 3: "Script Values / Mod" 步骤是一个 javascript/java 步骤,它使用 my_datesome_date 进行一些计算并得出两个结果变量。一个是作为字符串的数字,另一个是作为字符串的日期。在 javascript 步骤结束时,我有以下语句:

setVariable("NUMBER_VARIABLE", calculatedNumber, "r");
setVariable("DATE_VARIABLE", calculatedDate, "r");

我对 Pentaho 的理解有限。但据我所知,这会创建两个新变量 NUMBER_VARIABLEDATE_VARIABLE,并使其可用于所有其他工作和转换,因为它们设置为 root

use_variables 转换

这是我要使用变量NUMBER_VARIABLEDATE_VARIABLE 的地方。

第 1 步:我将“Generate Rows”作为此转换的第一步。

我想使用 NUMBER_VARIABLE 作为 Generate Rows 的 Limit。所以我把$NUMBER_VARIABLE 放在限制字段中。

第 2 步:Generate Rows”输入到我尝试使用 DATE_VARIABLE 的 javascript/java 步骤,如下所示:

var sdf = java.text.SimpleDateFormat("yyyy-MM-dd",locale);
var myDate = sdf.parse(DATE_VARIABLE.getString());

我的期望是这个设置应该可以正常工作。如果 NUMBER_VARIABLE 为 100,则下一次转换中 Generate Rows 的限制应设置为 100,它应生成 100 行,然后 javascript 步骤应针对这 100 行运行,DATE_VARIABLE 应在 javascript 步骤中可用以供使用.

当我运行这个作业时,calculate_variables 转换运行成功。但是,use_variables 转换失败并出现以下错误:

2018/09/19 10:02:40 - Calculate Dimension Attributes.0 - ERROR (version 7.0.0.1-37, build 1 from 2016-12-21 12.39.46 by buildguy) : Unexpected error
2018/09/19 10:02:40 - Calculate Dimension Attributes.0 - ERROR (version 7.0.0.1-37, build 1 from 2016-12-21 12.39.46 by buildguy) : org.pentaho.di.core.exception.KettleValueException: 
2018/09/19 10:02:40 - Calculate Dimension Attributes.0 - Javascript error: 
2018/09/19 10:02:40 - Calculate Dimension Attributes.0 - ReferenceError: "DATE_VARIABLE" is not defined. (script#9)

我无法弄清楚为什么会发生这种情况以及我可以做些什么来解决这个问题。

编辑 1:

当我将“Write to log”步骤附加到我的Generate rows 并尝试将变量记录为:

__________________________ the variables are _______________________

number variable=$NUMBER_VARIABLE
date variable=$DATE_VARIABLE
____________________________________________________________________

然后当我运行作业时,我确实成功打印了变量:

2018/09/19 10:11:20 - Write to log.0 - __________________________ the variables are _______________________
2018/09/19 10:11:20 - Write to log.0 - 
2018/09/19 10:11:20 - Write to log.0 - number variable=8662
2018/09/19 10:11:20 - Write to log.0 - date variable=2000-01-01
2018/09/19 10:11:20 - Write to log.0 - ____________________________________________________________________

这意味着变量设置正确并且在下一次转换中可用。为什么javascript步骤抱怨它?

【问题讨论】:

很高兴你解决了它。请回答您的问题(而不是编辑问题)。这是为了真正帮助像你一样陷入困境的人。 【参考方案1】:

我解决了。 :)

问题是我在 Javascript 步骤中使用变量的方式。

我改成:

var myDateVariable=getVariable("DATE_VARIABLE","");
var sdf = java.text.SimpleDateFormat("yyyy-MM-dd",locale);
var myDate = sdf.parse(myDateVariable);

希望这可以帮助像我一样陷入困境的人!

【讨论】:

必须测试,SimpleDateFormat,它不是线程安全的,不是必需的,但如果处理大量数据可能会出现错误值。 @simar:应该不是问题,因为我的 DATE_VARIABLE 是一个常量,所有东西都可以使用......

以上是关于Pentaho 数据集成 setVariable 和 getVariable 问题的主要内容,如果未能解决你的问题,请参考以下文章

Pentaho Kettle 修改的 Java 脚本 setVariable

Pentaho 中的 Hive 数据集成错误

Pentaho 组件集成

Pentaho 数据集成 Google BigQuery Loader 异常

Pentaho 数据集成:错误处理

Pentaho 数据集成用户定义的 Java 类