LOFTER for ipad —— 让兴趣,更有趣

点击下载 关闭

LOFTER-网易轻博

kettle

1523浏览    19参与
博客已迁移,请看签名

Kettle调度报错Error Transforming zip 解决方法

昨天做了kettle调度任务,今日检查输出日志,每个日志里面开头都有以下报错,虽然kjob都执行成功了,但是还是得解决:


-------------报错日志信息-----------------

2018/04/17 05:44:14 - cfgbuilder - Warning: The configuration parameter [org] is not supported by the default configuration builder for scheme: sftp

05:44:18,848 ERROR [WebjarsURLConnection] Error...

昨天做了kettle调度任务,今日检查输出日志,每个日志里面开头都有以下报错,虽然kjob都执行成功了,但是还是得解决:


-------------报错日志信息-----------------

2018/04/17 05:44:14 - cfgbuilder - Warning: The configuration parameter [org] is not supported by the default configuration builder for scheme: sftp

05:44:18,848 ERROR [WebjarsURLConnection] Error Transforming zip

java.io.IOException: Pipe closed

at java.io.PipedInputStream.checkStateForReceive(PipedInputStream.java:260)

at java.io.PipedInputStream.receive(PipedInputStream.java:226)

at java.io.PipedOutputStream.write(PipedOutputStream.java:149)

at java.util.zip.DeflaterOutputStream.deflate(DeflaterOutputStream.java:253)

at java.util.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:255)

at org.pentaho.osgi.platform.webjars.WebjarsURLConnection.transform(WebjarsURLConnection.java:190)

at org.pentaho.osgi.platform.webjars.WebjarsURLConnection.access$000(WebjarsURLConnection.java:54)

at org.pentaho.osgi.platform.webjars.WebjarsURLConnection$2.call(WebjarsURLConnection.java:90)

at org.pentaho.osgi.platform.webjars.WebjarsURLConnection$2.call(WebjarsURLConnection.java:87)

at java.util.concurrent.FutureTask.run(FutureTask.java:266)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at java.lang.Thread.run(Thread.java:745)

05:44:18,864 ERROR [WebjarsURLConnection] Error Transforming zip



-------------------------------------------------

百度了一波,解决方法很简单,清理一下缓存即可。

1)进入kettle安装目录{data-integration}\system\karaf

版本不一样缓存文件也不一样,有些是在{data-integration}\system\karaf\caches下

删除下面的data1文件,若有多个data都要删除



2)手动执行调度脚本bat查看日志是否好了呢?




博客已迁移,请看签名

Kettle6.0执行kitchen.bat调度任务

Kettle包括三大块:

   Spoon——转换/工作(transform/job)设计工具 (GUI方式)

   Kitchen——工作(job)执行器 (命令行方式)
   Span——转换(trasform)执行器 (命令行方式)


使用Kitchen帮助:

1.运行cmd,进入kettle的目录

cd C:\data-integration


2.运行kitchen.bat

./kitchen.bat


3.查看帮助


4.列出资源库目录:

.\Kitchen.bat...

Kettle包括三大块:

   Spoon——转换/工作(transform/job)设计工具 (GUI方式)

   Kitchen——工作(job)执行器 (命令行方式)
   Span——转换(trasform)执行器 (命令行方式)


使用Kitchen帮助:

1.运行cmd,进入kettle的目录

cd C:\data-integration


2.运行kitchen.bat

./kitchen.bat


3.查看帮助



4.列出资源库目录:

.\Kitchen.bat /rep 资源库名 /user 资源库用户 /pass 资源库密码 /listdir


5.列出某个目录下的所有作业(方便访问资源库的时候调用作业)

.\Kitchen.bat /rep 资源库名 /user 资源库用户 /pass 资源库密码 /dir 资源库某个目录名 /listjobs


6.编写定时任务脚本

如果使用不使用资源库可以这样写bat脚本:作业1.bat

C:

cd C:\data-integration

set sec=%TIME:~3,2%%TIME:~6,2%

Set h=%TIME:~0,2%

If %h% leq 9 (Set h=0%h:~1,1%) else (Set h=%h%)

Kitchen.bat /file:C:\Users\Administrator\Desktop\测试作业.kjb /level:Basic>>C:\Users\Administrator\Desktop\测试作业日志_%date:~0,4%%date:~5,2%%date:~8,2%_%h%%sec%.log


如果使用资源库可以这样写bat脚本:作业2.bat

C:

cd C:\data-integration

set sec=%TIME:~3,2%%TIME:~6,2%

Set h=%TIME:~0,2%

If %h% leq 9 (Set h=0%h:~1,1%) else (Set h=%h%)

Kitchen.bat /rep ziyuanku /user admin /pass admin /job 测试作业 /dir 测试1 /level:Basic>>C:\Users\Administrator\Desktop\测试作业日志_%date:~0,4%%date:~5,2%%date:~8,2%_%h%%sec%.log


如果需要一次调度多个作业需要编写list.bat,到时候直接调度这一个即可

脚本如下:list.bat

@ echo off

call C:\Users\Administrator\Desktop\BAT\作业1.bat

call C:\Users\Administrator\Desktop\BAT\作业2.bat

call C:\Users\Administrator\Desktop\BAT\作业3.bat


注:字体加粗部分参考帮助


7.windows设置定时任务调度

1)打开windows计划任务程序(我的计算机右击-管理-任务计划程序)



2)右击创建基本任务,填写信息下一步



3)选择执行周期,下一步



4)选择具体时间和次数,下一步



5)选择启动程序,下一步



6)选择bat文件位置,下一步



7)确认设置无误,点击完成



8)手动运行一次,成功即可



9)大功告成。



--------2018.04.17更新---------

昨天写调度脚本时手动执行一直报错找不到路径,具体没有截图。

说一下解决办法,检查自己的路径是否对,最好路径不要有中文,然后检查写文本的编码格式,要一致,用notepad++打开就可以查看到,一定要一致!!

utf-8和gb2312自选,只要一致问题不大。


参考链接:

http://f.dataguru.cn/thread-178515-1-1.html

https://blog.csdn.net/huiweizuotiandeni/article/details/54382639


博客已迁移,请看签名

Kettle抽取数据乱码问题解决

数据抽取乱码问题:连接添加参数characterEncoding,设置值为gbk/utf8

数据抽取乱码问题:连接添加参数characterEncoding,设置值为gbk/utf8

博客已迁移,请看签名

Kettle官方javascript脚本简单例子

来自Kettle官方简单例子

若有错误具体查看官方方法:

一、点击javascript组件:


二、打开函数转换


三、右击点击sample


四、即可看到官方的使用例子了


↓具体实现

一,String function

1 .date2str

//js操作时间

var dValue = new Date();

//把时间变成字符串

var dValue1 = date2str(dValue);

//把时间变成当前格式字符串

var dValue2 = date2str(dValue,"dd.MM....

来自Kettle官方简单例子

若有错误具体查看官方方法:

一、点击javascript组件:


二、打开函数转换


三、右击点击sample


四、即可看到官方的使用例子了



↓具体实现

一,String function

1 .date2str

//js操作时间

var dValue = new Date();

//把时间变成字符串

var dValue1 = date2str(dValue);

//把时间变成当前格式字符串

var dValue2 = date2str(dValue,"dd.MM.yyyy");

//把时间变成当前格式字符串

var dValue3 = date2str(dValue,"dd.MM.yyyy HH:mm:ss");

//把时间变成当前格式字符串 + 语言

var dValue4 = date2str(dValue,"E.MMM.yyyy","DE");

//把时间变成当前格式字符串 + 语言

var dValue5 = date2str(dValue,"dd.MM.yyyy HH:mm:ss","EN");

//把时间变成当前格式字符串 + 语言 + 时区

var dValue6 = date2str(dValue,"dd.MM.yyyy HH:mm:ss","EN", "EST");

var str = dValue1 + "\n" + dValue2 + "\n" + dValue3 + "\n" + dValue4 + "\n" + dValue5 + "\n" + dValue6;

Alert(str);

 

2.escapeStr1

  unEscapeHtml

//js加密解密1

var escapeStr = "<html></html>";

//编码字符串

var escapeStr1 = escapeHtml(str);

//解码字符串

var escapeStr2 = unEscapeHtml(escapeStr1);

Alert(escapeStr1 + "\n" + escapeStr2);

 

3.escapeXml

  unEscapeXml

//js加密解密2

var escapeXmlStr = "<html></html>" ;

//编码字符串    

var escapeXmlStr1 = escapeXml(escapeXmlStr);

//解码字符串

var escapeXmlStr2 = unEscapeXml(escapeXmlStr1);

Alert(escapeXmlStr1 + "\n" + escapeXmlStr2);

 

 

4.escapeSQL

//js转换SQL,把单引号变成双引号

var escapeSQLStr = "a'b'c"

var escapeSQLStr1 = escapeSQL(escapeSQLStr);

Alert(escapeSQLStr1);

 

 

5.fillString

//把这个 char复制10遍

Alert(fillString("a",10));

 

6.getOcuranceString

//判断这个字符串在另外一个字符串有多少个

Alert(getOcuranceString("abcakldhiasdku","h"));

 

 

7.indexOf

//搜索字符串

var str1= "Hello Pentaho!";

//搜索某个指定的字符串值在字符串中首次出现的位置

var str2= indexOf(str1, "Pentaho");

//搜索某个指定的字符串值在字符串第7个之后中首次出现的位置

var str3= indexOf(str1, "o", 7);

Alert(str2 + "\n" +str3);

 

 

8.initCap

//返回经过处理的字符串 -My Home

var str1 = "my home";      

Alert(initCap(str1));

 

 

9.lower

//把字符串的大写变成小写

var str1= "Hello World!";

var str2= lower(str1);

Alert("Input:" + str1);

Alert("Converted to LowerCase:" + str2);

 

 


10.upper

//把字符串变成大写

var str1= "Hello World!";

var str2= upper(str1);

Alert("Input:" + str1);

Alert("Converted to UpperCase:" + str2);

 

 

11.lpad

//判断字符串是否=>13,如果不够13,则在前面补足x至13个

var str1= "Hello World!";

Alert("Input:" + str1);

Alert("Lpad:" + lpad(str1, "x",13));

 

 

12.rpad

//判断字符串是否=>13,如果不够13,则在后面补足x至13个

var str1= "Hello World!";

Alert("Input:" + str1);

Alert("Rpad:" + rpad(str1, "x",13));

 

 

13.ltrim,Rtrim, trim

//去除字符串空格

var str1= "           Hello World!           ";

Alert("Input:" + str1+" "+str1.length);

//去除左边字符串

Alert("Ltrim:" + ltrim(str1)+" "+ltrim(str1).length);

//去除右边字符串

Alert("Rtrim:" + rtrim(str1)+" "+rtrim(str1).length);

//去除前后字符串空格

Alert("Trim:" + trim(str1)+" "+trim(str1).length);

 

 


14.num2str

//把数字变成字符串

var d1 = 123.40;

var d2 = -123.40;

//把数字变成字符串

Alert(num2str(d2));

//把字符串变成指定格式的字符串

Alert(num2str(d1, "0.00"));

//把字符串变成指定格式的字符串+区域

Alert(num2str(d1, "0.00", "EN"));

//把字符串变成指定格式的字符串+区域

Alert(num2str(d2, "0.00;(0.00)", "EN"));

 

 

15.protectXMLCDATA

//) 在XML中,指定某段内容不必被XML解析器解析时,使用<![CDATA[...]]>。也就是说中括号中的内容解析器不会去分析。所以其中可以包含>, <, &, ', "这5个特殊字符。经常把一段程序代码嵌入到<![DATA[...]]>中。 因为代码中可能包含大量的 >, <, &, "这样的特殊字符。

var str1 = "my home";      

Alert(protectXMLCDATA(str1));

 

 

16.removeCRLF

//去除字符串里面的回车 \n\r字符

var removeCRLFStr = "abc"+"\n"+"\r"+"abc";

Alert(removeCRLF(removeCRLFStr));

 

 

17.replace

//转换字符串

var str1 = "Hello World, this is a nice function";

//把字符串的World转换成 Folk   

var str2 = replace(str1,"World", "Folk");

Alert(str2);

//把字符串的World转换成 Folk nice 转换成 beautifull

var str2 = replace(str1,"World", "Folk", "nice","beautifull");

Alert(str2);

 

 


18.str2RegExp

//跟据指定字符切割字符串

var strToMatch = "info@proconis.de";

var strReg = "^(\\w+)@([a-zA-Z_]+?)\\.([a-zA-Z]{2,3})$";

var xArr =  str2RegExp(strToMatch, strReg);

if ( xArr != null ) {

    for(i=0;i<xArr.length;i++) {

    Alert(xArr[i]);

}

}

else {

    Alert("no match");

}

 

19.substr

//截取字符串

var str1= "0123456789";

//截取前面6个字符串,返回6789

var str2= substr(str1, 6);

//截取8个字符串,从第2个开始,返回23456789

var str3 = substr(str1,2,8)

Alert(str2);

Alert(str3);


 

二,numeric function

 

1.abs

//返回绝对值

var d1 = -1234.01;

var d2 = 1234.01;

Alert(abs(d1));

Alert(abs(d2));

 

2.ceil

//返回相反数

var d1 = -1234.01;

var d2 = 1234.01;

Alert(ceil(d1));

Alert(ceil(d2));

 

3.floor

//返回该数值的最大整数

var d1 = -1234.01;

var d2 = 1234.01;

Alert(floor(d1));

Alert(floor(d2));

 

4.str2num

//把字符串转成数字

var str1 = "1.234,56";

var str2 = "12";

//把字符串按照指定的格式转换成数字

Alert((str2num(str1,"#,##0.00")));

Alert((str2num(str2)));

 

5.trunc

//四舍五入取整,只能传double

Alert(trunc(new Date()));

 


三,Date Function

1.dateAdd

//再Date时间上增加

// y - Years

// m - Months

// d - Days

// w - Weeks

// wd - Workingdays

// hh - Hours

// mi - Minutes

// ss - Seconds

var d1 = new Date();

Alert(dateAdd(d1, "y", 1));

Alert(dateAdd(d1, "m", 4));

Alert(dateAdd(d1, "d", 5));

Alert(dateAdd(d1, "wd", 5));

 

2.dateDiff

//返回俩个时间类型之间的差异

var d1 = new Date();

var d2 = dateAdd(d1,"y",1);

Alert(dateDiff(d1,d2,"y"));

Alert(dateDiff(d1,d2,"m"));

Alert(dateDiff(d1,d2,"d"));

Alert(dateDiff(d1,d2,"wd"));

 

3.getDayNumber

//返回一个数值,对应一个格式

var d1 = new Date();

Alert(d1);

//这一年的第几天

Alert(getDayNumber(d1, "y"));

//这个月的第几天

Alert(getDayNumber(d1, "m"));

//这个星期的第几天

Alert(getDayNumber(d1, "w"));

//这个月的第几个星期

Alert(getDayNumber(d1, "wm"));

 

4.getFiscalDate

//返回财政日期的日期值,基于给定的偏移量。格式 dd.MM.(暂时不知道怎么用)

var d1 = new Date();

var str1 = "01.00.";

var str2 = "00.01.";

Alert(getFiscalDate(d1, str1));

Alert(getFiscalDate(d1, str2));

 

5.getNextWorkingDay

//返回下一个工作日,星期4-星期5,星期5-星期1

var d = new Date();

var d1 = getNextWorkingDay(d);

Alert(getNextWorkingDay(d1));

 

6.month

//返回当前月份0-11

var d1 = new Date();

Alert(month(d1));

 

7.quarter

//返回当前季度 1-4

var d1 = new Date();

Alert(quarter(d1));

 

8.week

//返回当前是这一年的第几个星期year(var)

var d1 = new Date();

Alert(week(d1));

 

9.year

//返回当前是第几年

var d1 = new Date();

Alert(year(d1));

 

10.str2date

//按照字符串格式转换成Data数据

Alert(str2date("01.12.2006","dd.MM.yyyy"));

Alert(str2date("01.12.2006 23:23:01","dd.MM.yyyy HH:mm:ss"));

Alert(str2date("Tue.May.2006","E.MMM.yyyy","EN"));

Alert(str2date("22.02.2008 23:23:01","dd.MM.yyyy HH:mm:ss","DE"));

Alert(str2date("22.02.2008 23:23:01","dd.MM.yyyy HH:mm:ss","DE", "EST"));

 


四,Logic Function

 

1.isCodepage

//检查,一个字符串值对给定的代码页(不知道怎么用)

var xStr = "Réal";

Alert(isCodepage(xStr, "UTF-8"));

 

2.isDate

//检查当前变量是不是时间变量

var d1 = "Hello World";      

var d2 = new Date();

Alert(isDate(d1));

Alert(isDate(d2));

 

3.isEmpty

//检查字符串是不是空的

var d = "Hello World";      

Alert(isEmpty(d));

 

4.isMailValid

//检查这个邮件地址是不是对的

var str = "qq132165432168468@.com";

Alert(isMailValid(str));

 

5.isNum

//检查这个有变量是不是数字

var str1 = "Hello World";      

var str2 = 123456;

Alert(isNum(str1));

Alert(isNum(str2));

 

6.isRegExp

//正则表达式匹配,先匹配第一个,如果没有直接返回-1,如果有接下去匹配,返回匹配条数

var email1 ="info@proconis.de";

var email2= "support@proconis.co.uk";

var email3= "HelloWorld@x";

var str = "啊";

 

var reg1="^\\w+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3}$";

var reg2="^[\\w-\.]+@([\\w-]+\\.)+[\\w-]{2,4}$";

var reg3 ="[^\x00-\xff]";

 

Alert(isRegExp(email1, reg1,reg2) + " Matches");

Alert(isRegExp(email2, reg1,reg2) + " Matches");

Alert(isRegExp(email3, reg1,reg2) + " Matches");

Alert(isRegExp(str, reg3) + " Matches");

 

7.isWorkingDay

//判断当前时间是不是工作日

var d1 = new Date();

Alert(isWorkingDay(d1));


五,Special Function

1.Alert

/*

//消息弹出框

Alert("Hello World!");

 

2.LoadScriptFile

//读取当前路径下的JavaScript文件

var xPfad = "C:/Users/LiHan/Desktop/adc.js";

LoadScriptFile(xPfad);

 

3.LoadScriptFromTab

//从表里读取Script(不知道怎么用)

var xTab = "Alert("+"Hello World!"+")";

LoadScriptFromTab(xTab);

 

4.LuhnCheck

//判断当前卡号是不是正确信用卡号

var str1 = "4444333322221111";      

Alert(str1 + ": " + LuhnCheck(str1));

var str2 = "4444333322221110";      

Alert(str2 + ": " + LuhnCheck(str2));

 

5.appendToFile

//把数据添加到文件。如果文件不存在,它将被创建。

var strFile = "‪C:/Users/LiHan/Desktop/abc.txt";

var strContent = "Hello World!";

appendToFile(strFile, strContent);

 

6.decode

//匹配字符串,返回指指定字符串或默认值

var str1 = "Hallo";

//匹配hallo 如果有返回hello,没有返回Hallo

Alert(decode(str1, "Hall", "Hello"));

//匹配1,如果有返回Mr。匹配2,如果有返回Mrs,没有返回指定值N/A

Alert(decode(str1, "1", "Mr", "2", "Mrs", "N/A"));

//匹配1,如果有返回Mr。匹配2,如果有返回Mrs,没有返回默认值,原字符串

Alert(decode(str1, "1", "Mr", "2", "Mrs"));

var str1 = "Mrs";

//匹配1,如果有返回Mr,匹配2,如果有返回Mrs,没有返回默认值,原字符串

Alert(decode(str1, "1", "Mr", "2", "Mrs"));

 

 

7.execProcess

//执行一个processus(不知道什么东西),返回执行结果

var processus="文件路径";

execProcess(processus);

 

8.fireToDB

//使用时(找不到MySQL连接不知道怎么使用)

var strConn = "MySQL";

var strSQL = "SELECT count(*) from ttt";

var xArr = fireToDB(strConn, strSQL);

 

 

9.getDigitsOnly, removeDigits

//返回字符串包含的数字的值

var str1 = "abc123cde";      

Alert(getDigitsOnly(str1));

//去除字符串中的数字

var str1 = "abc123cde";   

Alert(removeDigits(str1));

 

10.getEnvironmentVar,setEnvironmentVar

//获得kettle系统变量的值

Alert(getEnvironmentVar("user.dir"));

Alert(getEnvironmentVar("user.name"));

 

//设置系统全局变量

var strVarName="setEnvTest";

var strVarValue="123456";

Alert(getEnvironmentVar(strVarName));

setEnvironmentVar(strVarName,strVarValue);

Alert(getEnvironmentVar(strVarName));

strVarValue="654321";

setEnvironmentVar(strVarName,strVarValue);

Alert(getEnvironmentVar(strVarName));

 

11.getProcessCount

//返回当前处理行数

// 1: String - The Pentaho/Kettle Type:

// u - Lines Update

// i - Lines Insert

// w - Lines Write

// r - Lines Read

// o - Lines Output

Alert(getProcessCount("i"));

Alert(getProcessCount("o"));

 

12.getTransformationName

//返回当前js步骤名称,如果在转换中运行加上转换的名字

var xTranName = getTransformationName();

Alert(xTranName);

 

13.setVariable,getVariable

//设置kettle变量

var strVarName="getVariableTest";

var strVarValue="123456";

// 1: String - The name of the variable to set.

// 2: Variable - The value which should be assigned

// 3: Type - "s"ystem, "r"oot, "p"arent, "g"randparent. Upto which

//           level the variable is set.

setVariable(strVarName,strVarValue, "r");

//获取kettle变量,如果没有显示为空

Alert(getVariable("strVarName", ""));

 

14.Print, Println

//在结果中打印出这个字符串

var str = "Hello World!";

print(str);

//加一个换行

Println(str);

 

15.resolveIP

//转换为一个数字IP地址(x.x.x.x)作为字符串返回(不知道怎么用)

Alert(resolveIP("127.0.0.1","IP"));

 

16.sendMail

//把电子邮件发送到指定的地址

// sendMail(var, var, var, var, var);

// 1: String - SMTP-Server

// 2: String - The Address from which the mail shoud be send

// 3: String - The Address to which the mail should be send.

// For more Recipient's, please provide a list seperated by ','

// 4: String - Subject of the Mail

// 5: String - The Message Text of the mail.

var xSMTP="Your SMTP Server";

var xSender = "Sender eMail";

var xRecipients = "Recipient1,Recipient2,...";

var xSubject = "Hello World!";

var xMessage = "This is the message";

sendMail(xSMTP,xSender,xRecipients,xSubject,xMessage);

 

17.writeToLog

//写一个字符串到kettle日志里

// writeToLog(var);

// 1: String - The Message which should be written to

// the Kettle Debug Log

//

// writeToLog(var,var);

// 1: String - The Type of the Log

// d - Debug

// l - Detailed

// e - Error

// m - Minimal

// r - RowLevel

//

// 2: String - The Message which should be written to

// the Kettle Log

writeToLog("Hello World!");

writeToLog("r", "Hello World!");

 

六,File Function

1.copyFile

//复制一个文件

// copyFile(var1,var2,var3);

// 1: String - The file to copy with Path.

// 2: String - The destination filename with Path.

// 3: Boolean- Overwrite destination file if exist.

var sourcefile="‪C:/Users/LiHan/Desktop/abc.txt";

var destinationfile="D:/abc.txt";

copyFile(sourcefile,destinationfile,true);

 

2.createFolder

//在指定路径创建一个文件夹

var strFolder = "‪C:/Users/LiHan/Desktop/abcd";

createFolder(strFolder);

 

3.deletFile

//删除指定路径的文件

var strFile = "‪C:/Users/LiHan/Desktop/abc.txt";

deletFile(strFile);

 

4.fileExists

//判断文件是否存在

var strFile = "‪C:/Users/LiHan/Desktop/文件路径.xlsx";

Alert(fileExists(strFile));

 

5.getFileExtension

//返回文件类型

var sourcefile="C:/Users/LiHan/Desktop/文件路径.xlsx";

Alert(getFileExtension(sourcefile));

 

6.getFileSize

//返回文件大小

var sourcefile="C:/Users/LiHan/Desktop/文件路径.xlsx";

Alert(getFileSize(sourcefile));

 

7.getLastModifiedTime

//返回文件创建时间

var sourcefile="C:/Users/LiHan/Desktop/文件路径.xlsx";

var dateformat="yyyy-MM-dd HH:MM:ss";

Alert(getLastModifiedTime(sourcefile,dateformat));

 

8.getParentFoldername

//返回文件的父路径

var sourcefile="C:/Users/LiHan/Desktop/文件路径.xlsx";

Alert(getParentFoldername(sourcefile));

 

9.getShortFilename

//获取文件名

var sourcefile="C:/Users/LiHan/Desktop/文件路径.xlsx";

Alert(getShortFilename(sourcefile));

 

10.isFile

//判断是不是文件

var sourcefile="C:/Users/LiHan/Desktop/文件路径.xlsx";

Alert(isFile(sourcefile));

 

11.isFolder

//判断是不是文件夹

var sourcefile="C:/Users/LiHan/Desktop";

Alert(isFolder(sourcefile));

 

12.loadFileContent

//加载文件内容

Alert(loadFileContent("C:/Users/LiHan/Desktop/abc.txt"));

Alert(loadFileContent("C:/Users/LiHan/Desktop/abc.txt"));

//加载文件内容+字符集

Alert(loadFileContent("C:/Users/LiHan/Desktop/abc.txt","GBK"));

 

13.moveFile

//移动文件

// moveFile(var1,var2,var3);

// 1: String - The file to move with Path.

// 2: String - The destination filename with Path.

// 3: Boolean- Overwrite destination file if exists.

var sourcefile="C:/Users/LiHan/Desktop/abc.txt";

var destinationfile="D:/abc.txt";

Alert(moveFile(sourcefile,destinationfile,false));

 

14.touch

//创建一个文件,并修改文件的修改时间

Alert(touch("C:/Users/LiHan/Desktop/abcd.txt"));


博客已迁移,请看签名

Kettle常用组件使用教程(入门级三)

入门一、二已发布见前文

----------------------------------------------------------

组件:去除重复行


字段名称:关键字的字段

忽略大小写:是否忽略大小写

注意:去掉重复行 需先排序

实验十四:


如上图:自定义数据nage,age,有重复项name:2,age:2

如上流程,需要首先排序。

去除重复记录选择:


会提示一个警告,意思就是说要排序好,不然没办法去重,点个我明白就OK。

执行结果:


--------------------------------------------------...

入门一、二已发布见前文

----------------------------------------------------------

组件:去除重复行


字段名称:关键字的字段

忽略大小写:是否忽略大小写

注意:去掉重复行 需先排序

实验十四:


如上图:自定义数据nage,age,有重复项name:2,age:2

如上流程,需要首先排序。

去除重复记录选择:


会提示一个警告,意思就是说要排序好,不然没办法去重,点个我明白就OK。

执行结果:


----------------------------------------------------------------------

组件:排序记录


字段名称:选择排序的字段名称

升序:是否升序

大小写敏感:是否区分大小写

实验十五:


如图:自定义常量name混乱排序。

排序记录选择:


执行结果:


-------------------------------------------------------------------------------------

组件:过滤记录


条件:输入条件

发送True给的步骤:返回True的步骤

发送false给的步骤:返回false的步骤

实验十六:


如图:自定义常量数据,然后通过过滤记录,如果满足条件输出到空操作,若不满足输出到空操作2.

过滤记录选择:


意思是如果name=1.0,则发送ture数据到空操作,若不满足输出到空操作2.

执行结果:



---------------------------------------------------------------------

由于时间关系,无法继续讲解:

更多实例下载地址:https://pan.lanzou.com/i0g6ygh

部分截图:




博客已迁移,请看签名

Kettle常用组件使用教程(入门级二)

直接接到入门级一开始,未观看入门一,请移步观看入门级一

飞机直达:http://lcryblog.lofter.com/post/1e131973_11e346a4


组件:设置值Null


名称:选择替换的字段

需要转换成NULL的值:需要转换成NULL的值

实验八:


如图,自定义常量name,age两个字段,具体值如上,李3两个。

设置值为NULL选择:


执行结果:


----------------------------------------------------------------

组件:执行SQL脚本


数据库连接:选择数据库

SQL script...

直接接到入门级一开始,未观看入门一,请移步观看入门级一

飞机直达:http://lcryblog.lofter.com/post/1e131973_11e346a4


组件:设置值Null


名称:选择替换的字段

需要转换成NULL的值:需要转换成NULL的值

实验八:


如图,自定义常量name,age两个字段,具体值如上,李3两个。

设置值为NULL选择:


执行结果:


----------------------------------------------------------------

组件:执行SQL脚本


数据库连接:选择数据库

SQL script :输入要执行的SQL语句

参数:设置要替换的参数字段

实验九:


如图,自定义两个字段number,nage,具体数据如上

执行SQL脚本选择:


分析:执行插入语句,将自定义数据插入oracle数据表中,两个?的意思作为参数的字段

执行结果:


------------------------------------------------------------------

组件:Java Script代码 


Java Script:脚本的输入

字段名称:定义的字段名

input fields:输入字段

output fields:输出字段

改成为:新的字段名

类型:字段类型

实验十:


如图:自定义三个字段number1,number2,name,具体值如上。

执行Java Script选择:


分析:定义sum字段,将number1和number2相加,定义sumname字段不修改值,修改名为我是改名的方便观察结果。

执行结果:


-----------------------------------------------------------------------------

组件:合并记录


旧数据源:输入数据源

新数据源:输入数据源

匹配关键字段:匹配关键字段

数据字段:数据字段

实验十一:



如图,自定义常量和自定义常量2分别是两个字段no1和no2,具体值如上

注:合并记录一定要先对数据排序,按照一个关键字排序。


我这里就是按照no1排序

合并记录选择:


执行结果:


---------------------------------------------------------------

组件:排序合并


字段名称:选择字段的名称

实验十二:



如图:定义one1,one2两个字段,具体值如上

排序合并选择:


执行结果:


--------------------------------------------------------------------

组件:插入/更新


数据库连接:选择数据库

目标表:选择目标表

不执行任何更新:是否执行更新操作

查询的关键字:关键字

更新字段:选择要插入更新的字段

实验十三:


如图:自定义常量student_name,student_number两个字段,具体值如上

插入/更新选择:


执行结果:


testkettle数据库查询如下:


--------------------------------------------------------------




博客已迁移,请看签名

Kettle常用组件使用教程(入门级一)

Kettle简介:

Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳定。

Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。

下载地址:https://community.hds.com/docs/DOC-1009855

安装自行百度,直接打开Kettle


组件:值映射


使用的字段名:源字段

目标字段名:目标字段

不匹配时的默认值:默认值

源值:源数据的值

目标值:替换的值

实验一:


如图,自定义常量name,age,sex...

Kettle简介:

Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳定。

Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种数据放到一个壶里,然后以一种指定的格式流出。

下载地址:https://community.hds.com/docs/DOC-1009855

安装自行百度,直接打开Kettle




组件:值映射


使用的字段名:源字段

目标字段名:目标字段

不匹配时的默认值:默认值

源值:源数据的值

目标值:替换的值

实验一:


如图,自定义常量name,age,sex三个字段,具体数据如上。

值映射选择:


执行运行结果:

----------------------------------------------------------------------------------

组件:增加常量


名称:映射字段

类型:字段类型

格式:数据格式

长度:

值:常量的值

实验二:


如图:自定义name,age,like三个字段,具体值如上

增加常量选择:


执行结果:



--------------------------------------------------------------------------

组件:计算器


新字段:映射字段

计算:计算类型

字段A,B,C:需计算的字段

值类型:数据的类型

实验三:


如图:自定义常量number1,number2,具体数值看上。

计算器选择:


执行结果:


-------------------------------------------------------------------------
组件:获取系统信息


名称:显示的名称

类型:显示的类型(系统时间,IP,指令等等)

实验四:


执行结果:


----------------------------------------------------------------------------

组件:增加序列


值的名称:映射值的名称

起始值:序列的初始值

增长根据:设置每次增加的值

最大值:设置最大值

实验五:


如图:自定义常量数据nage,age。

增加序列选择:


执行结果:


-------------------------------------------------------------------------------

组件:表输出


数据库连接:设置数据库

目标表:设置目标的表

提交记录数量:设置提交数量

裁剪表:先删除再增加数据

忽略插入错误:跳过错误,继续执行

指定库字段:

数据库字段:选择插入的字段

实验六:


如图,两个字段name,age,具体值如上。

表输出选择:


执行结果:


输出到oracle数据库的biaoshuchu表中了。

------------------------------------------------------------------------

组件:多路选择(Switch/Case)


switch字段:设置Switch的字段

case的数据类型:设置值的类型

分支值:

case分组标志:自己设置

case值:设置case的值

目标步骤:跳过的操作步骤

缺省的目标步骤:未通过的操作步骤

实验七:


如图,字段name,age,详细数值如上;

Switch/Case选择:


分析:age字段值为10的输出文本文件输出,值为12的输出到文本文件输出2,值为13的输出到文本文件输出3

执行结果:



--------------------------------------------------------------------------

Ja's 工作簿

Kettle解决Excel输出日期数据空值

可能是由于Kettle程序自身机制,在使用Excel输出的时候无法识别流中的日期字段。即使从表输入来的字段本身已经是日期数据,最终在输出Excel步骤中如果定义对应列为日期,输出依然是空值。

要解决这个问题,只能在Excel输出前强行改变日期字段的原数据为Date类型,最终再在Excel输出步骤定义对应列的格式即可。


可能是由于Kettle程序自身机制,在使用Excel输出的时候无法识别流中的日期字段。即使从表输入来的字段本身已经是日期数据,最终在输出Excel步骤中如果定义对应列为日期,输出依然是空值。

要解决这个问题,只能在Excel输出前强行改变日期字段的原数据为Date类型,最终再在Excel输出步骤定义对应列的格式即可。



天善智能

 【线上活动】Kettle 基础开发及疑难解答,时间周五下午两点-四点,商业智能BI问答社区社区专家线上答疑活动。访问商业智能BI问答社区 http://www.flybi.net/people/expert 看到你们!   【每周都有在线交流、社区专家与你同在】 


 【线上活动】Kettle 基础开发及疑难解答,时间周五下午两点-四点,商业智能BI问答社区社区专家线上答疑活动。访问商业智能BI问答社区 http://www.flybi.net/people/expert 看到你们!   【每周都有在线交流、社区专家与你同在】 


天善智能
【线上活动】Kettle 基...

 【线上活动】Kettle 基础开发及疑难解答,时间周五下午两点-四点,商业智能BI问答社区社区专家线上答疑活动。访问商业智能BI问答社区http://www.flybi.net/people/expert 看到你们!   【每周都有在线交流、社区专家与你同在】 


 【线上活动】Kettle 基础开发及疑难解答,时间周五下午两点-四点,商业智能BI问答社区社区专家线上答疑活动。访问商业智能BI问答社区http://www.flybi.net/people/expert 看到你们!   【每周都有在线交流、社区专家与你同在】 


son_of_mars

使用kettle抽取mysql数据库,提升性能的方法

如果没有显示的设置,mysql是不支持批量提交的,必须在url中设置rewriteBatchedStatements 例如:

String connectionUrl="jdbc:mysql://127.0.0.1:3306/test?rewriteBatchedStatements=true"; 


如何在ktr文件里添加此属性呢?如图:


需要在connection标签的attributes属性中增加真的mysql的格外属性配置即可。


参考:

http://www.iteye.com/topic/1134810

mysql的rewriteBatchedStatements...

如果没有显示的设置,mysql是不支持批量提交的,必须在url中设置rewriteBatchedStatements 例如:

String connectionUrl="jdbc:mysql://127.0.0.1:3306/test?rewriteBatchedStatements=true"; 


如何在ktr文件里添加此属性呢?如图:

使用kettle抽取mysql数据库,提升性能的方法 - mars - son of mars

 需要在connection标签的attributes属性中增加真的mysql的格外属性配置即可。


参考:

http://www.iteye.com/topic/1134810

mysql的rewriteBatchedStatements介绍:

http://www.cnblogs.com/chenjianjx/archive/2012/08/14/2637914.html

文華_iDoctor
【跟着唐顿学英语】 A nic...

【跟着唐顿学英语】

A nice kettle of fish. 真是糟糕(的局面)


  • a fine/pretty kettle of fish: a situation that will cause you problems 困境,尴尬的局面

  • another/ a different kettle of fish: informal used to say that a situation that is very different from one that you have just mentioned 【非正式】完全不同的两回事

【跟着唐顿学英语】

A nice kettle of fish. 真是糟糕(的局面)


  • a fine/pretty kettle of fish: a situation that will cause you problems 困境,尴尬的局面

  • another/ a different kettle of fish: informal used to say that a situation that is very different from one that you have just mentioned 【非正式】完全不同的两回事

我们的故事

kettle查询出来的真实值被识别为null

问题描述:

通过关联表查询出来的applyId(申请编号),在数据流里也是能看到的,但是在写入到数据表中的时候,由于设置了这个字段不能为空,所以一直报错。

问题实质:

数据流内存在的数据却不能保存,原因是在查询该字段的时候,没有设置该字段类型,即使数据流里能看到该字段,也不能被使用。

解决办法:

找到原因,就好解决了,在查询处为查询的结果添加数据类型。为了节省因为这类问题产生干扰所浪费的时间,建议按规范处理,数据流内的数据一定要添加数据类型,一面出现一些很稀奇的错误,把宝贵的时间浪费在找错的过程中。

问题描述:

通过关联表查询出来的applyId(申请编号),在数据流里也是能看到的,但是在写入到数据表中的时候,由于设置了这个字段不能为空,所以一直报错。

问题实质:

数据流内存在的数据却不能保存,原因是在查询该字段的时候,没有设置该字段类型,即使数据流里能看到该字段,也不能被使用。

解决办法:

找到原因,就好解决了,在查询处为查询的结果添加数据类型。为了节省因为这类问题产生干扰所浪费的时间,建议按规范处理,数据流内的数据一定要添加数据类型,一面出现一些很稀奇的错误,把宝贵的时间浪费在找错的过程中。

我们的故事

导出kettle数据转换设置

在本地测试好的数据清洗配置,要转移到服务器上,就要用到导出数据转换设置。

一直是这使用
是在导入设置的

时候总是提示不是kettle的文档格式。后来才发现这是资源库的配置,而不是数据转

换的配置。

导出数据转换配置,可以在 “文件——导出”处执行,保存为kettle格式的文档,再执

行导入就可以了

在本地测试好的数据清洗配置,要转移到服务器上,就要用到导出数据转换设置。

一直是这使用
是在导入设置的

时候总是提示不是kettle的文档格式。后来才发现这是资源库的配置,而不是数据转

换的配置。

导出数据转换配置,可以在 “文件——导出”处执行,保存为kettle格式的文档,再执

行导入就可以了

我们的故事

kettle新建资源库出错

之前在本地测试新建kettle资源库很顺利,但是在把本地数据迁移到服务器的过程中出现了问题,多次新建资源库失败,提示插入数据错误。

解决办法:

将要执行的sql语句复制出来,单独在Navicat下执行,然后就可以顺利登录资源库了。

之前在本地测试新建kettle资源库很顺利,但是在把本地数据迁移到服务器的过程中出现了问题,多次新建资源库失败,提示插入数据错误。

解决办法:

将要执行的sql语句复制出来,单独在Navicat下执行,然后就可以顺利登录资源库了。

生活LOFT

Home Term Kitchenware Chapter--Kettle

=============================

【Concept】

 
    One kind of a water container , a variety of materials , may refer to the metal pot boil can also refer to portable water jug.
=============================
【 Material taxonomy terms 1】 


    Stainless...

Home Term Kitchenware Chapter--Kettle - 生活LOFT - 生活LOFT / Life LOFT

 

=============================

【Concept】

 
    One kind of a water container , a variety of materials , may refer to the metal pot boil can also refer to portable water jug.
=============================
【 Material taxonomy terms 1】 


    Stainless steel / plastic / glass / resin material
    Special materials such as birch bark appearance, high-tech plastic liner .
=============================
【2 Press  Use classification terms】

-----------------
1 [ Kettle ]
 
    Hot water , that is hot -to-use , multi- use for tea
-----------------
(2) [ a water bottle ]
 
    Insulation / without insulation
Insulation water :
    Are double stainless steel vacuum insulation pot , used for hotels, clubs, meeting rooms, the demand for domestic hot water
=============================
【Terminology pot crafts】

-----------------
1 [ use ]
 
    Filled with water , put the wine , home furnishings , especially for tourism , travel, sports and leisure to carry, is the Northeast handicrafts and tourism souvenirs flagon gift .
-----------------
(2) [ Production Method ]
 
    Handmade .
-----------------
3 [ Specifications ]
 
    28 * 12 * 4.5cm
-----------------
4 [ capacity ]
 
    1000ml is 2 pounds .
-----------------
5 [ Weight ]
 
    200g
-----------------
6 [ packaging ]
 
    Each product has a Russian manual tag, transparent plastic bag.
-----------------
7 [ MEAS ]
 
    67 * 42 * 46cm per box two small boxes, small boxes 24 each , each large box 48 , the standard export carton.
=============================
【 Sport Bottle】  


    Many people will doubt , sports bottle water bottle is already not that type of a breakdown yet , yes, but if another professional breakdown , it can be classified from its application , and
Are the following:
-----------------
1 , [ sports ]
 
    Refers to a combination of some more intense stadium kettle , such as jogging , hiking, etc. , is characterized by a greater emphasis on the quality of the engaging and sealing functions.
-----------------
2 , [ Outdoor ]
 
    Refers hiking, picnic, travel and other occasions , and there is more light , hanging buckle multiple forms .
-----------------
3 , [ students ]
 
    Can be said that almost kettle for outdoor use , but because as a child to use , in the design and production of professional kettle is different from , and more attention to students with sports bottle is easy to use and easy to use , for example, is that we can all use instead of rotating the plug openings and other openings .
=============================

 

【Article is excerpted from: Web Search】
【Reserved Integrate / Just Reference】
【Translation is by The Network】 

生活LOFT

Kitchenware articles Kitchen chapter--Kettle

==================================================================
"Concept"
A container for holding water, a variety of materials, that heats a metal pot, can also refer to portable drinking water pots.
==================================================================
"Materials...

Kitchenware articles Kitchen chapter--Kettle - 生活LOFT - 生活LOFT / Life LOFT

 

==================================================================
"Concept"
A container for holding water, a variety of materials, that heats a metal pot, can also refer to portable drinking water pots.
==================================================================
"Materials"
Stainless steel, plastic, glass, resin material, there are also special materials such as birch bark exterior, high-tech plastic liner.
==================================================================
"Crafts pots"
-----------------
[Use]
Water, for wine, home furnishings, especially suitable for sports tourism, travel to carry, is North-East Special tourism souvenir tourist arts and crafts and hip flask gifts.  
 
-----------------
[Methods]   
Pure hand-made.   
-----------------
[Specification]   
28*12*4.5cm   
-----------------
[Capacity]   
1000ml is 2 kg.  
 
-----------------
[Weight]   
200g
-----------------
[Package]   
Each product has a Russian description tag, packed in a transparent plastic bag.
-----------------
[Packing size]
67*42*46cm in each case 2 small boxes, each small box 24, box 48, standard exporting box.
==================================================================
"Sports bottle"
Many people will doubt, sport bottle is not already did a segment type is a kettle, Yes, but if the professional segment, from its application for classification, include the following:  
 
-----------------
1, [sports]
Refers to the combination of some of the more intense sports water bottle, such as running, climbing, is characterized by more focus on the padlock and seal of quality.
  
-----------------
2, [outdoor]
Refers to the hike, picnic, travel, etc, is characterized by more light, multiple forms of padlock.  
 
-----------------
3, [student]
Can be said that outdoor water bottle, but because it is a child uses, in the production and design of professional pot is different from, student's sport bottle more pay attention to ease of use and ease of use, such as is the open cover can be rotated instead of saizikaigai.
==================================================================
"Canteen"
-----------------
[Capacity]
1L
-----------------
[Dimension]
10*15*18cm
-----------------
[For]
Field work, mountain climbing, hiking, fishing, camping, etc.
 
-----------------
[How-to]
Pot after antioxidant treatment, short-term water quality does not change, adding a small amount of red wine you will extend the storage time.
  
-----------------
[Note]
Lunch box when heated, you must first install the handle, so as not to burn.
==================================================================


 【Article is excerpted from: Baidu Encyclopedia】
【Network reprint / Just reference】
【Translation is by Goolge】

路过

ETL工具——kettle插件开发(基础篇)

在我们做ETL工作的时候,在某些项目中往往会遇到一些特别的流程任务,kettle原有的流程处理节点已经不能满足我们的要求,这时候我们就需要定制流程处理节点了。定制流程节点主要是针对数据的管理、数据的验证和某些特别文件数据的提取。大家通过查看kettle源代码,就可以知道怎样去创建你自己的kettle插件了。

这篇文章主要告诉大家在kettle 4.0版本上怎样开发一个transformation类型的简单插件,这个插件可以接受任何记录流,然后在流后面再添加一个带值的字段,用户能够定义字段的名称,插件非常简单。O(∩_∩)O~ 我将尽可能简洁的介绍开发插件需要掌握的一些接口规范。
准备工作:
1、下载...

在我们做ETL工作的时候,在某些项目中往往会遇到一些特别的流程任务,kettle原有的流程处理节点已经不能满足我们的要求,这时候我们就需要定制流程处理节点了。定制流程节点主要是针对数据的管理、数据的验证和某些特别文件数据的提取。大家通过查看kettle源代码,就可以知道怎样去创建你自己的kettle插件了。

这篇文章主要告诉大家在kettle 4.0版本上怎样开发一个transformation类型的简单插件,这个插件可以接受任何记录流,然后在流后面再添加一个带值的字段,用户能够定义字段的名称,插件非常简单。O(∩_∩)O~ 我将尽可能简洁的介绍开发插件需要掌握的一些接口规范。
准备工作:
1、下载pdi-ce-4.0.0-stable.zip,供桌面测试用。
2、下载eclipse,任何版本都可以,装好SVN插件,后面下载kettle源代码之用。
3、  下载标准插件源代码模板工程
建立插件工程:
1、  将下载的“标准插件源代码模板工程”导入到您的工作空间
2、  导入后工程会有一些错误,那是因为依赖的包没有导入。这时,你需要解压pdi-ce-4.0.0-stable.zip,进入解压目录将lib目录下面kettle打头的所有jar包以及libswt/win32下面的swt.jar包(这个大家依赖操作系统导入)加入工程环境变量里面。
3、  重新编译一下工程,应该就没有错误了。
kettle转换步骤工作组件:
这里有四个类构成了这个kettle 步骤/节点,每一个类都有其特定的目的及所扮演的角色。
TemplateStep:  步骤类实现了StepInteface接口,在转换运行时,它的实例将是数据实际处理的位置。每一个执行线程都表示一个此类的实例。
TemplateStepData:  数据类用来存储数据,当插件执行时,对于每个执行的线程都是唯一的。执行时里面存储的东西主要包括数据库连接、文件句柄、缓存等等其他东西。
TemplateStepMeta: 元数据类实现了StepMetaInterface接口。它的职责是保存和序列化特定步骤实例的配置,在我们这个例子中,它负责保存用户设置的步骤名称和输出字段的名称。
TemplateStepDialog:对话框类实现了该步骤与用户交互的界面,它显示一对话框,通过对话框用户可以自己的喜好设定步骤的操作。对话框类与元数据类关系非常紧密,O(∩_∩)O~ 想想为什么吧? (元数据类可以追踪用户的设置)
除了上面的代码,还有一个plugin.xml,它设置好了插件的元数据,定义了步骤在kettle图形工作台中的显示效果。为了更好的让大家理解,我将利用这个步骤设计一个转换流程并执行它。对于插件的开发,我们将从plugin.xml配置文件开始讲起,然后讲讲元数据和对话框类,最后再讲讲步骤类和数据类。
书写你自己的plugin.xml:
下面plugin.xml是我们这个插件里面的内容,它的功能是告诉kettle插件的元数据类,插件的名称及描叙,还有需要加载的jar包。想要了解细节,可以查看文章:plug-in loading

<?xml version="1.0" encoding="UTF-8"?> <plugin id="TemplatePlugin" iconfile="icon.png" description="Template Plugin" tooltip="Only there for demonstration purposes" category="Demonstration" classname="plugin.template.TemplateStepMeta">
<libraries> <library name="templatestep.jar"/> </libraries> </plugin>

ID:在kettle插件中必须全局唯一,因为被kettle序列化了,所以不要随便改变
Iconfile: kettle中插件显示的图片,必须是png图片
Description:插件描叙,显示在树形菜单里面。
Tooltip:树形菜单中,鼠标滑过的时候显示的提示信息
Category:插件显示的父目录
Classname:元数据类
Library:指明了插件需要加载所依赖的jar包
一、元数据类:
下面显示了元数据的几个关键的方法,注意元数据类里面用私有成员变量outputField 存储了下一个步骤的输出字段。
// keep track of the step settings
public String getOutputField()
public void setOutputField(…)
public void setDefault()
// serialize the step settings to and from xml
public String getXML()
public void loadXML(…)
// serialize the step settings to and from a kettle repository
public void readRep(…)
public void saveRep(…)
// provide information about how the step affects the field structure of processed rows
public void getFields(…)
// perform extended validation checks for the step
public void check(…)
// provide instances of the step, data and dialog classes to Kettle
public StepInterface getStep(…)
public StepDataInterface getStepData()
public StepDialogInterface getDialog(…)
TemplateStepMeta元数据类其实还有很多方面,不过大多被他的父类BaseStepMeta给默认实现了,这些默认的实现足以使我们的元数据类工作良好。想要了解更多,大家可以查查关于StepMetaInteface和BaseStepMeta的kettle官方文档。
二、对话框类:
TemeplateStepDialog为步骤实现了对话框的设置,kettle的用户界面部件是使用的eclipse的swt框架,如果要开发比较复杂的对话框,你还必须熟悉大部分swt代码。 Swt文档大家可以从eclipse上的帮助菜单点击在线获取。在开发过程中,一个对话框对象拥有一个元数据对象,它记录了应该从哪里读取配置?应该把设置好的配置保存在哪里? 它仅仅设置了输出字段的名称在我们这个模板步骤里面。一个继承自BaseStepDialog特定的对话框类必须提供open(…)方法,这个方法必须返回这个步骤的名称(发生改变时)或NULL(对话框被取消时)
三、步骤类:
步骤类是实际的处理和转换工作的地方。因为大部分样本代码已经由父类BaseStep提供了,大多数插件仅仅关注下面几个特定的方法就行。
// initialization and teardown
public boolean init(…)
public void dispose(..)
// processing rows
public void run()
public boolean processRow(..)
Init()方法在转换执行前被kettle调用,转换必须在所有步骤初始化成功时才真正执行。我们这个模板步骤没有做任何事情,这里仅仅是拿出来让大家了解了解。
dispose()方法是在步骤执行完之后执行(非转换执行完哈),它完成资源的关闭,像文件句柄、缓存等等。
run()方法在实际处理记录集的时候调用。里面其实是个调用processRow()方法处理记录的小循环,当此步骤再没有数据处理或转换被停止时退出循环。
processRow()方法在处理单条记录的时候被调用。这个方法通常通过调用getRow()来获取需要处理的单条记录。 这个方法如果有需要将会被阻塞,例如当此步骤希望放慢脚步处理数据时。processRow()随后的流程将执行转换工作并调用putRow()方法将处理过的记录放到它的下游步骤。
注意:你的步骤可能会变记录的结构,为了安全起见,一定要多熟悉包org.pentaho.di.core.row,特别是类RowMetaInterface和RowDataUtil。
基类BaseStep对处理的记录提供了第一次访问的标识,在某些代码只执行一次的时候可能非常有用,例如某个费时的查找,其实这就是缓存。
四、数据类:
大多数步骤都需要临时的缓冲或者临时的数据。数据类就是这些数据合适的存放位置。每一个执行线程将得到其拥有的数据类实例,所以它能在独立的空间里面运行。TemplateStepData继承自BaseStepData,作为一个经验法则,不要将non-constant字段放置BaseStepData类里面,如果你必须,请将它最好放置TemplateStepData数据类里面.
我们的步骤仅仅使用了一个数据对象来存储记录集输出的结构,没有用到其他的存储介质,例如文件等等。
总结:
一个kettle步骤插件包括4个类,每一个类都有自己的角色和职责,元数据、对话框、步骤和数据类很好的结合在一起工作,特别是因为很多样板代码和通用的方法已经被父类实现,使得kettle的插件开发非常容易,若有需要讨论的,大家可以在http://www.ahuoo.com上给我留言,欢迎打扰!下一篇我们将具体讲解的插件开发及调试。O(∩_∩)O~
转自:http://www.ahuoo.com/?p=418

LOFTER

让兴趣,更有趣

简单随性的记录
丰富多彩的内容
让生活更加充实

下载移动端
关注最新消息