开源ETL工具kettle系列之动态转换
摘要本文主要讨论使用Kettle来设计一些较为复杂和动态的转换可能使用到的一些技巧,这些技巧可能会让你在使用Kettle的时候更加容易的设计更强大的ETL任务。 动态参数的传递Kettle 在处理运行时输入参数可以使用JavaScript 来实现,大部分工作只是按照一个模板来处理的。 argument当你在运行一个转换的时候,不管这个转换是一个Job的一部分还是只有这个转换,你都可以传递参数给它,当你运行一个转换的时候,会弹出一个 Execution a Transformation 的对话框,让你选择执行转换的方式,本地执行,远程执行,分布式执行,下面就是日志记录的级别和回放时间,然后是argument 和 variables 的设定。Argument 和 variables 的区别在官方FAQ里面也有解释。你也可以参考一下官方的解释和下面解释的异同。 取得argument的值我们在转换之前设置了argument的值,需要用到的时候就使用get system info 步骤,这个步骤取得在运行时参数,需要注意的是我们是先设置get system info,然后在里面决定要使用多少个参数,最多10个,每个参数名叫什么,然后我们才能在运行时看到你设置了的参数名后面跟一个要你输入的值,并且参数类型是不能够指定,全部都当作字符串处理,如果你需要对参数类型有要求,你需要自己转换,使用一个Mapping步骤或者Select values步骤。 取得variable的值Variable 的值个数不受限制,你可以在kettle菜单的set environment里面设置,也可以使用文件储存这些值,在第一次运行kettle之后,kettle会在 使用脚本Kettle使用的是JavaScript来作为它的脚本实现,使用的是mozilla 的rhino 1.5r5版本实现,如果你打算实现一些复杂的计算过程,比如字符串分割,数据类型转换,条件计算等等,你都应该使用脚本语言来搞定。 var display;
var displayHasToBeDisposed=false;
var shell=null;
try {
display=Packages.org.eclipse.swt.widgets.Display.getCurrent();
shell=display.getActiveShell();
} catch(e) {
// if it runs in batch mode (Pan or preview mode) no Display is available,so we have to create one
display=new Packages.org.eclipse.swt.widgets.Display();
displayHasToBeDisposed=true;
shell=new Packages.org.eclipse.swt.widgets.Shell(display);
}
// if we run in Pan we need to load the properties:
if(!Packages.org.pentaho.di.ui.core.PropsUI.isInitialized()) {
Packages.org.pentaho.di.ui.core.PropsUI.init(display,2); //2=TYPE_PROPERTIES_PAN
}
var dateDefaultFrom=DateFromProposal.getString().substr(0,10); //only the date and not the time
var dialogDateFrom=new Packages.org.pentaho.di.ui.core.dialog.EnterTextDialog(shell,"Date from","Please enter the beginning date",dateDefaultFrom);
var dateFromAsString=dialogDateFrom.open();
if(dateFromAsString!=null && dateFromAsString.length()>0) {
var dateDefaultTo=DateToProposal.getString().substr(0,10); //only the date and not the time;
var dialogDateTo=new Packages.org.pentaho.di.ui.core.dialog.EnterTextDialog(shell,"Date to","Please enter the ending date",dateDefaultTo);
var dateToAsString=dialogDateTo.open();
if(dateToAsString!=null && dateToAsString.length()>0) {
// here you could check or change formats a.s.o
} else {
// stop transformation when user cancels
throw new Packages.java.lang.RuntimeException("Input canceled by the user.");
}
} else {
// stop transformation when user cancels
throw new Packages.java.lang.RuntimeException("Input canceled by the user.");
}
if(displayHasToBeDisposed) {
display.dispose();
}
Display 和 shell 都是swt 里面的对象,你只用知道他们是表示UI的就可以了. 调试调试可不是程序的专利,ETL过程同样需要调试过程,Kettle同样支持比较简单的调试过程,你可能已经发现了在菜单下面的工具栏下面有一个debug 和preview 按钮来支持调试过程,这种调试的技巧同样可以用来帮助你完成一些复杂的ETL工程,下面以一个例子来解释调试过程. 这个窗口左边列出了在这个转换中所有的步骤,我们选取Generate ID 步骤,然后设置断点的条件: Kettle支持两种断点的方法,一种基于限定结果集的数量大小,另一种是基于条件的判断过程。 我们选择基于结果集大小的方式,只查看前面5条数据。 你会看到Kettle列出了Generate ID 步骤产生的前面5条数据, 从上图中可以看到这个generate id 步骤产生了5个值并不是连续的,下面的按钮Close,Stop 可以控制当前线程是继续还是停止. 利用调试的方法可以帮住我们设计一些需要基于条件判断的复杂ETL过程,我们使用调试的方法来查看数据中是否可能存在某些特定数据,以此来设计一些ETL过程针对这些数据进行处理。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |