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、检查临时文件夹内容是否为空
4.9、上传上一部临时文件夹中表数据到ftp,ftp上需要定义好路径及文件目录
ftp目录:
界面:
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上每个表一个目录,每个表十分钟同步一次,文件名以时间增加:
华清莲日常点滴,方便自己,成长他人!