PDI(kettle) JavaScript组件使用及错误处理

JavaScript组件简介

参考:https://help.hitachivantara.com/Documentation/Pentaho/9.2/Products/Modified_Java_Script_Value
在这里插入图片描述

  • **步骤名称:**指定画布上修改的 Java 脚本值步骤的唯一名称
  • **Transform Scripts:**在此步骤中创建的脚本
  • **Transform Constants:**预定义的静态常量,用于控制数据行发生的情况。您必须为 trans_Status 变量分配一个常量值。要使用这些常量,必须首先CONTINUE_TRANSFORMATION在脚本的开头设置 trans_Status 变量,以便将变量分配给正在处理的第一行。否则,将忽略对 trans_Status 变量的任何后续分配。双击常量以将其添加到 script脚本窗格
         常量:
            CONTINUE_TRANSFORMATION 包括输出行集中的当前行;
            SKIP_TRANSFORMATION 从输出行集中排除当前行并继续处理下一行;
            ERROR_TRANSFORMATION 从输出行集中排除当前行,生成错误,并且不处理任何剩余的行。
            ABORT_TRANSFORMATION 从输出行集中排除当前行,不处理任何剩余的行,但不会产生错误。(此常量不会在 PDI 客户端 PDI 客户端中显示,但可以在脚本中使用)
  • **Transform Functions:**可以在脚本中使用的字符串、数字、日期、逻辑、特殊和文件函数。这些包含的函数是用 Java 实现的,执行速度比 JavaScript 函数快。每个函数都有一个演示其用法的示例脚本。双击该函数以将其添加到 Java 脚本窗格。右键单击并选择 Sample 以将示例添加到 script脚本窗格。
  • **Input Fields:**步骤的输入字段
  • **Output Fields:**步骤的输出字段
  • **兼容模式?**选择兼容模式选项以使用2.5JavaScript 引擎的 版本。如果未选择此选项(默认),该步骤将使用 JavaScript 引擎的第 3 版。
    在 2.5 引擎中,值对象是可以直接修改的,并且它们的类型可以改变。例如,您可以将日期变量转换为字符串。这在 3.0 引擎中不受支持,因此 JavaScript 应该运行得更快。有关不同版本的更多详细信息,请参阅将 JavaScript 从 2.5.x 迁移到 3.0.0。
    PDIPDI 使用 Mozilla 的 Rhino 引擎。(9.2版本的似乎没得选择兼容模式)
    优化级别选择 JavaScript 优化的级别。这些值是:
    1:JavaScript 在解释模式下运行。
    0:不执行优化。
    1-9:执行所有优化。9 通过更快的脚本执行执行最多的优化,但编译速度较慢。默认值为 9。

使用JavaScript处理错误数据

该处以校验公民身份证号码为例:

//Script here
var idCard = INPUT_COLUMN_01;
var regIdCard = /^(^[1-9]\d{5}(19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)$/;
try{
	if(regIdCard.test(idCard)){
		if(idCard.length == 18){
			var idCardWi = new Array( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ); //将前17位加权因子保存在数组里
			var idCardY = new Array( 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ); //这是除以11后,可能产生的11位余数、验证码,也保存成数组
			var idCardWiSum = 0; //用来保存前17位各自乖以加权因子后的总和
			for(var i = 0; i < 17; i ++){
				idCardWiSum += idCard.substring(i,i+1) * idCardWi[i];
			}
			var idCardMod = idCardWiSum % 11;//计算出校验码所在数组的位置
			var idCardLast = idCard.substring(17);//得到最后一位身份证号码
			//如果等于2,则说明校验码是10,身份证号码最后一位应该是X
			if(idCardMod == 2){
				if(idCardLast == "X" || idCardLast == "x"){
					trans_Status= CONTINUE_TRANSFORMATION;
				}else{
					throw{
						error_describe:"公民身份证号码校验码验证失败,请检查!",
						error_num:1,
						error_column:"INPUT_COLUMN_01",
						error_code:"NOT_ALLOW_IDCARD"
					}
				}
			}else{
				//用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
				if(idCardLast == idCardY[idCardMod]){
					trans_Status= CONTINUE_TRANSFORMATION;
				}else{
					throw{
						error_describe:"公民身份证号码校验码验证失败,请检查!",
						error_num:1,
						error_column:"INPUT_COLUMN_01",
						error_code:"NOT_ALLOW_IDCARD"
					}
				}
			}
		}
	}else{
		throw{
			error_describe:"公民身份证号码校验码验证失败,请检查!",
			error_num:1,
			error_column:"INPUT_COLUMN_01",
			error_code:"NOT_ALLOW_IDCARD"
		}
	}
} catch (e){
	trans_Status= SKIP_TRANSFORMATION;
	 _step_.putError(getInputRowMeta(),row, e.error_num, e.error_describe, e.error_column, e.error_code);
}

说明:INPUT_COLUMN_01为输入字段
throw里面的四个字段为自定义字段,可以设置成你自己想要的名称,javascript步骤定义错误处理配置能够配置那些字段输出到错误处理步骤
step.putError前两个參数通常被指定为getInputRowMeta()和row,其它參数取决于你想怎么详细描写叙述所遇到的错误。即throw里面的字段
在这里插入图片描述
连线错误处理的hop如下:
在这里插入图片描述

使用JavaScript加密数据

这里的例子是计算row里面的md5Hex
在这里插入图片描述
PS:计算md5Hex需要将commons-codec-1.3jar放至…\data-integration\lib下面,具体版本无所谓了
感觉吧。。。只要JavaScript脚本写得出来的都可以放到里面去跑。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值