kettle-如何使用JavaScript步骤

描述

这是“ JavaScript值 ”步骤的修改版本,可提供更好的性能和更轻松的基于表达式的用户界面,以构建JavaScript表达式。此步骤还允许您为每个步骤创建多个脚本。

另请参阅“将JavaScript从2.5.x迁移到3.0.0 ”以获取更多内部细节。

您本地的“ data-integration / samples / transformations”文件夹中也有很多示例。

请记住,由于该步骤正在解释JavaScript,因此在性能上存在劣势。如果性能对您至关重要,请参阅“脚本”部分中的其他步骤。

Java脚本功能

本节提供了可用脚本,函数,输入字段和输出字段的树状视图。

  • 转换脚本:显示在此步骤中创建的脚本列表
  • 转换常数:一组预定义的静态常数,包括SKIP_TRANSFORMATION,ERROR_TRANSFORMATION和CONTINUE_TRANSFORMATION
  • 转换函数:包含各种字符串,数字,日期,逻辑和专用函数,可用于创建脚本。要将功能添加到脚本中,只需双击该功能或将其拖动到脚本中要插入的位置。
  • 输入字段:进入步骤的输入列表。双击或使用拖放将字段插入脚本。
  • 输出字段:步骤的输出列表。

Java脚本

在此部分中,您可以编辑此步骤的脚本。您可以通过双击要插入的节点或将对象拖到Java脚本面板上,从左侧的树控件中插入函数,常量,输入字段等。

字段

字段表包含脚本变量的列表,包括添加元数据(如描述性名称)的功能。

附加功能

  • 获取变量 按钮 -从脚本中检索变量列表。
  • 测试脚本 按钮 -使用此按钮可以测试脚本的语法。

Java脚本内部API对象

您可以使用以下内部API对象(供参考,请参见源代码中的类):

  • TransformationName:具有实际转换名称的字符串
  • step: org.pentaho.di.trans.steps.scriptvalues_mod.ScriptValuesMod的实际步骤实例
  • rowMeta: org.pentaho.di.core.row.RowMeta的实际实例
  • row:实际数据Object []的实际实例

常见问题

兼容性开关有什么作用?

javascript引擎有两个版本:2.5版本和3版本。如果选中了“兼容模式”(默认情况下为“兼容模式”),则javascript的工作方式与2.5版相同。显然,应尽可能使用新版本,因此,如果可以的话,请取消选中“兼容模式”。

这两个版本之间的最大区别是,在2.5中,值对象可以直接修改,并且它们的类型可以更改(日期变量可以转换为字符串)。这可能会导致细微的错误(有关更多详细信息,请参见迁移2.5-> 3.0文档)。由于在3.0版本中不再可能,因此javascript也应该更快。

有关更多详细信息,请阅读迁移2.5-> 3.0 doc。

如何检查行中字段的存在(启用兼容性)?

以下代码段(使用兼容功能打开)可让您进行检查。但是请记住,您不能在PDI中混合行,流经单个跃点的所有行必须具有相同数量的字段,并且它们必须具有相同的名称和类型。

片段:

var idx = row.searchValueIndex("lookup");
if ( idx < 0 )
{
   var lookupValue = 0;
}
else
{
   var lookupValue = row.getValue(idx);
}

没有兼容性的相同代码段已打开:

var idx = getInputRowMeta().indexOfValue("lookup");
if ( idx < 0 )
{
   var lookupValue = 0;
}
else
{
   var lookupValue = row[idx];
}

如何连续添加新字段

预先注意,将字段添加到行中的顺序很重要。始终以相同的顺序添加字段以保持行的结构连贯。

现在添加一个字段:

在源代码中将其定义为“ var”,并将其添加为JavaScript对话框下半部分的fields表中的字段。

如何修改值(关闭兼容性)

在3.0及更高版本中,更改输入值(以及可能更改其类型)的首选方法是创建一个新变量,并使用主要javascript文本区域下方的“字段”列表将其输出。然后在单独的“选择值”步骤中,用新变量替换旧变量。尽管它比2.5中的样式略差,但是代码应该更快,更安全。

或者(可以在4.1.0-GA之后改进错误报告),可以使用“替换值’Fieldname’或’Rename To’”字段。如果是,则使用“重命名为”字段(或者如果为空白,则使用“字段名”字段)来查找现有字段并替换其值和元数据类型。如果输入流中不存在指定的字段,则将错误传递到下一步,指示找不到要替换的字段。

如何修改值(启用兼容性)

启用兼容性后,按如下所示在输入字段上使用setValue(假设field1是输入行中的字段):

field1.setValue(100);

setValue()接受可以在PDI中使用的所有可能的类型(还包括String,Dates等)。

如何在JavaScript中使用类似NVL的内容?

启用兼容性开关后,可以使用以下构造(获得类似nvl(a,‘0’)的东西):

var a;
if ( fieldname.isNull() )
{
    a = '0';
}
else
{
    a = fieldName.getString();
}

您还可以使用:

fieldName.nvl('1');

如果fieldName为null,则它将用’1’的值替换fieldName的值。

如何分割字段

在一个字段中,我有包含数字和字符的商家代码,例如。“ 12345McDonalds”。我想拆分它,但是该字段没有一致的布局,我想拆分第二部分中的数字第一部分。

使用以下一段JavaScript,Merchant_Code是输入字段的名称

var str = Merchant_Code.getString();
 
var code = "";
var name = "";
 
for (i = 0; i < str.length(); i++ )
{
    c = str.charAt(i);
    if ( ! java.lang.Character.isDigit(c) )
    {
        code = str.substring(0, i);
        name = str.substring(i);
        Alert("code="+code+", name="+name);
        break;
    }
}

Alert()仅用于显示字段。在外部for循环之后,您可以在新的单独字段中添加代码和名称,例如

比较值

来自数据行的所有值都是Java对象,因此无法对带有“ =”,“>”,“ <”等的值进行比较。

您需要使用特定于Java对象的比较方法(请参见下面的示例)。

比较字符串值

确保使用以下构造:

string.equals(otherString)

确保不要对字符串使用==运算符

如果要忽略大小写差异,也可以使用以下方法:

string.equalsIgnoreCase(otherString)

比较数值

默认情况下,即使您认为分配了整数,JavaScript中分配的大多数值都是浮点值。

无论是什么情况,如果您在使用==或在已知本质上为整数的值上切换/大小写时遇到麻烦,请使用以下构造:

parseInt(num)==parseInt(num2)

或者

switch(parseInt(valuename))
{
case 1:
case 2:
case 3:
 strvalueswitch = "one, two, three";
 break;
case 4:
 strvalueswitch = "four";
 break;
default:
 strvalueswitch = "five";
}

筛选行

如果要过滤行,即从输出中删除行,则可以设置trans_Status变量:

trans_Status = CONTINUE_TRANSFORMATION
if (/* add your condition here */) trans_Status = SKIP_TRANSFORMATION

从输出中删除所有符合条件的行。

参考

https://wiki.pentaho.com/display/EAI/Modified+Java+Script+Value

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值