设计工程
DMETL中的工程是一个个与数据清洗转换与同步相关的对象的集合;从逻辑上来说,工程包括转换、作业、函数、变量和调度等五种子集合。其中,转换和作业统称流程,负责执行业务逻辑;函数可扩展系统功能;变量用于在不同流程和流程组件之间传递参数和数据;流程可在流程设计器中手动执行,但一般多为其配置调度、以后台调度方式执行。
创建project-HOTEL_Management工程
在DMETL首页,用户可点击【设计】下的【工程】按钮,进入工程管理页面,选中【工程】,右键选择【新建工程】,在弹出的新建工程对话框中,输入工程名与描述,即可完成工程的创建。
之后,依次展开工程→project-HOTEL_Management,可在相应节点中创建各种工程子对象。
创建“转换--PERSON_INFO数据清洗转换与同步”转换
选中【转换】,右键选择【新建转换】,在弹出的新建转换对话框中,输入转化名与描述,即可完成转换的创建。
DMETL中的转换代表一个执行数据处理的流程,是由数据读取组件、数据转换组件、数据装载组件以及正确线、错误线组成,一个可以执行的转换必须包含至少一个组件。
双击“转换--PERSON_INFO数据清洗转换与同步”,进入流程设计界面,通过拖拽的方式进行转换设计;依次从右侧拖入【数据读取--增量表】、【数据转换--数据清洗转换】、【数据转换--列转换】、【数据装载--增量表】等组件,并按顺序用SUCCESS_CONNECTION(将鼠标指针移至组件图标上,用鼠标左键按住绿色下三角,即可拉拽出来)连接起来,然后给组件重命名(鼠标右键点击组件图标,选中“重命名”,即可给组件重命名,然后点击空白处,完成操作);设计结果如下图所示。
各组件的主要配置情况如下各图所示。
备注:选中【首次同步时同步基表数据】,则在该组件首时次运行时,先从基表(即本例中的PERSON_INFO表)中读取数据并包装成INSERT型增量数据、再从增量表(即本例中的PERSON_INFO_SHADOW_CDC表)中读取增量数据,向下游组件输出。
备注:函数inferAgeFromID的创建,见步骤(4)
创建“作业--旅客信息更新与统计”作业
选中【作业】,右键选择【新建作业】,在弹出的新建作业对话框中,输入作业名与描述,即可完成作业的创建。
DMETL中作业是一个控制转换和其它作业节点的执行顺序和过程的流程,由作业节点和连接线构成;一个作业至少包含一个作业节点,但节点之间的连接不是必须的。用户可以通过作业控制转换及其它作业节点之间执行的先后顺序、依赖关系,因此,作业又被称为控制流。作业中的连接线表示作业节点的执行顺序,连接线分为成功线、失败线、完成线和条件线;成功线表示如果作业节点执行成功则继续执行后续节点,失败线表示作业节点执行失败后再继续执行后续节点,完成线表示无论作业执行成功还是失败,都继续执行后续节点,条件线表示当满足一定的条件时,才执行后续的节点。
双击“作业--旅客信息更新与统计”,进入流程设计界面,通过拖拽的方式进行作业设计;依次从右侧拖入【引用--转换】、【脚本--设置变量】、【脚本--SQL脚本】等组件,并按顺序用SUCCESS_CONNECTION(将鼠标指针移至组件图标上,用鼠标左键按住绿色下三角,即可拉拽出来)连接起来,然后给组件重命名(鼠标右键点击组件图标,选中“重命名”,即可给组件重命名,然后点击空白处,完成操作);设计结果如下图所示。
各节点的主要配置情况如下各图所示。
TRUNCATE TABLE HOTEL."旅客信息统计表";
INSERT INTO HOTEL."旅客信息统计表" VALUES('1、总人数', CAST((${guestCountTotal}) AS VARCHAR(50)));
INSERT INTO HOTEL."旅客信息统计表" VALUES('2、男性人数', CAST((${guestCountMale}) AS VARCHAR(50)));
INSERT INTO HOTEL."旅客信息统计表" VALUES('3、女性人数', CAST((${guestCountFemale}) AS VARCHAR(50)));
备注:${guestCountTotal}表示引用变量guestCountTotal的值;变量的创建见步骤(5);
创建inferAgeFromID函数
选中【函数】,右键选择【新建函数】,在弹出的对话框中输入函数名、函数内容、函数描述,点击【确定】,完成函数的创建。
函数名:
inferAgeFromID
函数内容:
import java.util.Calendar;
public static int inferAgeFromID(String id, int initialage)
{
if ( id.length() != 18 )
{
return initialAge;
}
Calendar calendar = Calendar.getInstance();
int yearNow = calendar.get(Calendar.YEAR);
int monthNow = calendar.get(Calendar,MONTH) + 1:
int dayNow = calendar.get(Calendar.DATE);
int year = Integer. value0f( id.substring(6,10) );
int month = Integer.valueOf( id.substring(10,12) );
int day = Integer.valueOf( id.substring(12,14) );
return ( ( month < monthNow ) || ( month == monthNow && day = dayNow ) )
? ( yearNow - year ) : ( yearNow - year - 1 );
}
函数描述:
根据身份证号推算年龄
该函数的功能是,根据身份证号推算年龄。
**DMETL支持使用函数来对数据进行处理,扩展系统功能。**除了使用系统函数外,DMETL还支持用户自定义函数。用户自定义函数必须完全遵循java语言的函数语法规则,函数必须声明为“public”以及“static”类型,且函数名中填写的“函数名”与函数内容中填写的“函数名”必须一致,否则函数检验会报错。函数定义中可以调用系统函数,也可以调用第三方函数;将依赖的第三方包放到<执行器根目录>\function\third目录下即可。使用【检验函数】按钮可以检查函数定义的语法是否正确。同一工程中的函数不允许重名,工程函数与全局函数不允许重名。
创建变量
选中【变量】,右键选择【新建变量】,在弹出的对话框中输入变量名、变量值表达式、变量描述,点击【确定】,完成变量的创建。所需创建的变量的相关信息见下表:
变量名 | 变量值表达式 | 变量描述 |
---|---|---|
guestCountTotal | 0 | 用于在作业执行过程中,缓存旅客总人数 |
guestCountMale | 0 | 用于在作业执行过程中,缓存男性旅客人数 |
guestCountFemale | 0 | 用于在作业执行过程中,缓存女性旅客人数 |
DMETL中使用变量在不同的流程和流程组件之间传递参数和数据。变量的数据类型一般为java中的基本类型或者java类,由其值的类型决定。
创建perMinute调度
选中【调度】,右键选择【新建调度】,如下图所示,完成调度的创建。
一个流程可以引用多个调度,一个调度也可以被多个流程引用。
为作业配置调度
选中“作业--旅客信息更新与同步”,右键选择【配置调度】,在弹出的流程调度配置对话框中,勾选需要引用的调度即可,如下图所示。
至此,一套较为完整的数据处理系统就搭建好了,后续可以对其进行简单地测试。