Kettle循环DB表数据到FTP实例(Extract)

浏览: 3244

ETL是构建数据仓库的重要一环,用户从数据源抽取出所需的数据,经过数据清洗,最终按照预先定义好的数据仓库模型,将数据加载到数据仓库中去。本实例是第一步:抽取。因网段不同,需要将DB数据库中的表抽取到ftp上面,并且新增表数据是按照时间生成新的文件数据,便于网络原因引起的数据获取不及时误删的情况,然后删除数据有获取程序处理,为了便于程序的参数可配和智能化,加入了链接信息参数以及同步表的动态可配。具体程序流程如下:


1、新建一个转换DbToFtpVariableSet


2、生成随机数randomVariable,定义为随机字符串

3、配置信息获取(获得db数据库和ftp的连接信息),格式如下,配置参数到properties.xls中,sheet名字本例取为


界面:




4、LocalToFtp,整体流程


4.1、getUpdateTable,获取数据需要同步的数据表参数列表,配置到needTables.xls中

needTable中参数列名为upTable,同步的表名之间用~加以分割,因后续js针对此符号进行切割


kettle界面:


4.2、Initialization variable,变量的初始化,code:

var prevRow=previous_result.getRows();
var times =5;//循环次数
var d = new Date();
var fiveMinutes=d.getTime();//用时间戳作文件名
//var fiveMinutes=Date.parse();
if (prevRow == null && (prevRow.size()==0))
{
false;
  
}else{
    parent_job.setVariable("timespan",prevRow);
    parent_job.setVariable("size", times);//存储执行表的总数量
parent_job.setVariable("i", 1);//循环控制变量
    parent_job.setVariable("fiveMinutes", fiveMinutes);
    
parent_job.setVariable("starts","drv_mon_stat_misjudge");//表名,后续每个表一个文件夹,对应数据放入制定目录下
true;
}

4.3、for loop,每个表循环一次


4.4、写入文件,便于验证和记录循环进程


4.5、清除历史文件夹下的数据


对饮bat代码(里面表面要每个文件夹修改成对应表名即可):

%删除上次文件%
D:
cd D:\DWBI\ETL\业务考试监管\loacalPath\DRV_MON_IMP_ROWLOG\temp
if exist  "DRV_MON_IMP_ROWLOG.txt"  (del DRV_MON_IMP_ROWLOG.txt) else (echo "文件不存在")
echo "删除数据文件"

预先每个表文件路径及存放方式:


4.5、getTableData,从数据库指定时间段增量同步数据到D:\DWBI\ETL\业务考试监管\loacalPath\${starts}\temp\文件夹下



输出表数据到文本文件,因表不确定,所以 字段可以不要选择 


4.6、检查目录是否为空,查看上一步同步的数据是否存在


4.7、把上一部同步的表数据放入本地的一个临时文件夹


4.8、检查临时文件夹内容是否为空 

Clipboard Image.png

4.9、上传上一部临时文件夹中表数据到ftp,ftp上需要定义好路径及文件目录

ftp目录:

Clipboard Image.png

界面:

Clipboard Image.png

Clipboard Image.png

4.10、循环条件重新赋值

var list_Tables =parent_job.getVariable("timespan").split("~");//对字符串切分
var size = new Number(parent_job.getVariable("size"));
var i = new Number(parent_job.getVariable("i"))+1;
var d = new Date();
var fiveMinutes=d.getTime();
//var fiveMinutes=Date.parse();
if(i<=size){
parent_job.setVariable("starts", list_Tables[i]);
}
parent_job.setVariable("i",i);
parent_job.setVariable("fiveMinutes",fiveMinutes);
true;
 

程序最后达到目的,ftp上每个表一个目录,每个表十分钟同步一次,文件名以时间增加:

Clipboard Image.png


华清莲日常点滴,方便自己,成长他人!

推荐 2
本文由 华青莲 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

2 个评论

功能很强大啊。
嗯,里面很多功能,用到的换是个别的几个!

要回复文章请先登录注册