`
shiren1118
  • 浏览: 130626 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

发一个我写的ETL(BI)工具perletl开源项目

    博客分类:
  • db
阅读更多

BI--商务智能
DW--数据仓库

一定是未来10年的重头戏。我们知道现在企业级应用越来越多,数据量自然越来越大,尤其以电信,银行,erp,电子商务,社交网络等非常明显。以移动为例,每天n个T的话单数据,以校内网为例,它现在成立了一个数据仓库部门,在招人,使用hive数据库,比如做营销的北京新华信,比如淘宝~~~~~~~业界也是,比如teredata公司推出了pb级别的数据仓库,1pb=1024T,大家可以想象一下pb是个什么概念

数据仓库是面向主题,保存的是历史数据,它不需要事务处理,它需要进行多维分析,也就是说一旦数据进入到数据仓库,它就基本不会改变了
那么它是怎么进入到数据仓库的呢?

答案是ETL(抽取,转换,加载),当然etl的范畴里也包含数据清洗。



this is a pm for ETL,now the first version support DB2,in future,maybe add mysql,Oracle etc

这是我用perl写的perl模块,主要是通过perl操作DB2。内置了很多使用功能,是ETL的好帮手
本模块对容错,事物,连接方式都进行了优化,尤其擅长对db2的各种操作

实用功能:如定时执行任务······
 
Google code上
项目主页:http://code.google.com/p/perletl/
可以用svn检出,地址:svn checkout   http://perletl.googlecode.com/svn/trunk/ perletl-read-only

如不熟悉svn,自行搜索tortoise svn


<hr>

     perl连接DB2方式1:DBI::DBD

       1. 1组成部分

              -getDbHandler 同DBconnect(),建立并获取数据库连接
              -PrepareExecuteSql? 预编译SQL
              -TransRollback? 出错事务回滚
              -disconnect 与DBconnect()相反,销毁数据库连接

       2. 2执行部分

              -executeSQL 执行完SQL要我们手动关闭连接,用于处理多行SQL

              -executeOnceSQL 执行完SQL会自动关闭连接。
              -getSelect 获取结果集,然后自己写while进行处理。(内部无日志版getStatement)
              -getAllCount 获得表中记录总数,参数是表名

              -getCountBySQL 通过SQL获得表中记录总数,参数是SQL,如“select count(0) from mk_vsdm.a”返回的是数组的第一个,所以不要select多个字段

        -dropTables 删除表,如果存在DBI::DBD连接,使用它,没有就用db2cmd删除。可以容错。参数是模式名+表名组成的多个字符串数组,参数可以是1个,也可以是多个
        -isDb2TableExist 检测表名是否存在



    perl连接DB2方式2:

        -run_db2cmd_main 首先会调用setUserAndPasswd获取用户名密码,然后就可以执行SQL


    工具方法:

        -run_cmd 调用bat文件
        -mylog 普通日志打印
        -mySubLog 方法前日志打印,以+号和-号拼成的
        -myTabLog 在mylog日志前多一个tab
        -myStatusLog 执行状态日志打印,在myTabLog基础上,外加3个*号

    日期 :

        -createDir 创建相对路径




    TODO :支持多个connection,很简单写一个newConnection方法,在executeSQL中加connection参数。
 

1
3
分享到:
评论
2 楼 shiren1118 2010-04-13  
#!/usr/bin/perl
##########################################################################
# (c) Copyright Snug sang. 2010 All rights reserved.
#  SourceName   :  DB2Util.pm
#  Description  :  Defines common functions like command line argument checking
#             Also, functions to prepare and execute an SQL statement, and
#               roll back if an error occurs.etc.
#  Author       : Snug sang   <shiren1118@gmail.com>
#  Create_time  :  2010-03-15
#  Modify_time  :  2010-03-17
#
#
#   -getAllCount              获得表中记录总数,参数是表名
#   -getCountBySQL            通过SQL获得表中记录总数,参数是SQL,如“select count(0) from mk_vsdm.a”返回的是数组的第一个,所以不要select多个字段
#
#
#  Execute      :  perl getAccount.pl 20100318
#
#
##########################################################################
select STDERR; $|=1;
select STDOUT; $|=1;

use DBI;
use strict;
use warnings;


# access the module for DB2  Utility functions
use DB2Util;



##########################################################################
# Description : 获得表mk_vsdm.a的记录总数
# Input       : None
# Output      : 表mk_vsdm.a的记录总数 
###########################################################################
sub getAccount{
#sql语句
  my $sql = "select count(0) from mk_vsdm.a";

#执行并获得返回的数值
my @aaa = ETL::getSelect( $sql )->fetchrow();

return $aaa[0];
}

 

 
##########################################################################
# Description : 主方法,脚本入口函数
# Input       : None
# Output      : None
###########################################################################
sub main
{
  #查看当前表中的记录数
  ETL::mylog( "my sub  :".getAccount());

#提取表中所有记录总数
ETL::mylog(  "ETL::getAllCount sub   :".ETL::getAllCount("mk_vsdm.a"));

#通过sql来提取表中所有记录数
ETL::mylog( "ETL::getCountBySQL  sub  :".ETL::getCountBySQL("select count(0) from mk_vsdm.a"));

#关闭连接
ETL::disconnect();

return 0;
}


######################################################################
# program section

# To see if there is one parameter,
# if there is no parameter, exit program
if ( $#ARGV < 0 )
{
   exit(1);
}
# Get the first argument
my $CONTROL_FILE = $ARGV[0];

my $TX_DATE = substr(${CONTROL_FILE},length(${CONTROL_FILE})-8,;
if ( substr(${CONTROL_FILE}, length(${CONTROL_FILE})-3, 3) eq 'dir' ) {
    $TX_DATE = substr(${CONTROL_FILE},length(${CONTROL_FILE})-12,;
};
# init date variables
ETL::initDate($TX_DATE);
my $TX_MONTH=substr($TX_DATE,0,6);
open(STDERR, ">&STDOUT");
my $ret = main();
exit($ret);







1 楼 shiren1118 2010-04-13  
#!/usr/bin/perl
##########################################################################
# (c) Copyright Snug sang. 2010 All rights reserved.
#  SourceName   :  DB2Util.pm
#  Description  :  Defines common functions like command line argument checking 
#             		 Also, functions to prepare and execute an SQL statement, and 
#            		   roll back if an error occurs.etc.
#  Author       : Snug sang   <shrien1118@gmail.com>
#  Create_time  :  2010-03-15
#  Modify_time  :  2010-03-17
#
#								写好一个bat,放到一个sub方法中,然后在main方法中写一个while死循环	 
#								 检测日期equal 某个日期(年月日时分秒)
#
#
#  Execute      :  perl  run_db2cmd.pl  20100318
##########################################################################
select STDERR; $|=1;
select STDOUT; $|=1;

use DBI;
use strict;
use warnings; 


# access the module for DB2  Utility functions
use DB2Util;
 


sub callTask{

  #execute E:\aaa\test.bat
	my $bat=" D:
           cd qw
           call a.bat 
        ";
  
	print $bat;
	
	#正式脚本打开下面注释。
	#调用cmd执行bat脚本
	ETL::run_cmd($bat);
}

  
	
	
sub main
{
  #日期变量
	my $myDay="";
	
	#计数器变量
	my $account=0;
	
	while(1){
		#可能参数列表:
		#year
		#mon
		#day
		#hour
		#minute
		#second
		#weekOfDay
		#yearOfDay
		$myDay=ETL::getTimeBy("hour");
		$account = $account + 1 ;
		 
		sleep(10);
		
		#这里是15点调用callTask()方法,可以在if条件里加15点40分22秒···
		if($myDay eq "15"){
			#方法日志
		  ETL::mySubLog();
			
			#普通日志
		  ETL::mylog("第  $account 次 调用callTask()");
			
			#核心方法,调用bat文件
		  callTask();
			
			#方法日志
			ETL::mySubLog();
		}
		
		#编写退出while条件,即什么时候停止调用
		if($myDay eq "16"){
		
			ETL::mylog("调用callTask() finished");
			
			exit(0);
			
		}
	  
	
	}

	return 0;
}


######################################################################
# program section

# To see if there is one parameter,
# if there is no parameter, exit program
if ( $#ARGV < 0 )
{
   exit(1);
}
# Get the first argument
my $CONTROL_FILE = $ARGV[0];

my $TX_DATE = substr(${CONTROL_FILE},length(${CONTROL_FILE})-8, 8);
if ( substr(${CONTROL_FILE}, length(${CONTROL_FILE})-3, 3) eq 'dir' ) {
    $TX_DATE = substr(${CONTROL_FILE},length(${CONTROL_FILE})-12, 8);
};
# init date variables
ETL::initDate($TX_DATE);
my $TX_MONTH=substr($TX_DATE,0,6);
open(STDERR, ">&STDOUT");
my $ret = main();
exit($ret);



 




相关推荐

Global site tag (gtag.js) - Google Analytics