python实现Oracle/Mysql ETL 导入greenplum 使用说明

一、配置文件 :config 参数说明:

[Path]
#脚本解压目录
Path =  /home/kettle/PyETL/
[Url]
#源URL:支持Oracle / Msql 
#Oracle 源
SrcUrl = {'dbtype':'oracle','user': '用户名','passwd': '密码', 'tns': 'ip:1521/server_name',  'encoding': 'utf-8'}
#mysql源
#SrcUrl = {'dbtype':'mysql','user': '用户名','passwd': '密码','dbname': '库名', 'host': 'IP','port':3306}
#目标URL 仅支持greenplum
DstUrl = {'dbtype':'greenplum','user': '用户名','passwd': '密码', 'dbname': '库名','host':'ip','port':'5432'}
#Tab1 : 名字随意起,支持写多个
[Tab1]
#'Exp':'y' 导出:y/n  | 'Imp':'y' 导入:y/n
ExpImp = {'Exp':'y','Imp':'y'}
#需要导出表的列表:
#Tab=表1,表2,........
#或
#Tab=表1:分区名1:分区名2,表2:分区名1:分区名2......
Tab= test
#column =  '列1','列2','列3','列4'
#或 
#column =  *  -- 所有列
#需要导入的列:与greenplum里的列一致
Column =  *
#查询条件:
#Condition=<唯一索引列或主键>:条件
Condition= id:last_update_date > trunc(sysdate - 1)  and last_update_date < trunc(sysdate)

二、修改main.py里的代码:

 

三、注意事项:

1、支持按分区导入:

        参数设置:

        #tables=表1:分区名1:分区名2,表2:分区名1:分区名2......

2、数据中存在的“;”转换为“|”,避免与生成的csv格式的";"冲突

        代码位置:

        py_tool=>脚本:DataBase.py=>函数:WriteCSV:

d.DataFrame(dat.replace(';','|',regex = True)).to_csv(csv_dir,sep=';',quoting=3,header = False,index=False,encoding='utf-8')

3、脚本运行环境python3.6

因为环境为python3.6,如果使用crontab,需要写入shell脚本:如下:

#!/bash/bin
#因为需要连接Oracle需要安装客户端:
export ORACLE_HOME=/u01/oracle/instantclient_11_2
export SQLPATH=/u01/oracle/
export TNS_ADMIN=/u01/oracle/
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export LD_LIBRARY_PATH=$ORACLE_HOME:$LD_LIBRARY_PATH 
export PATH=$PATH:$ORACLE_HOME
#调用python3脚本
python3 /home/kettle/PyETL/py_main/Main.py config1.ini Log1 1> /dev/null 2>&1


crontab -l
#日志清理脚本,每天第一个执行:
02 00 * * * sh /home/kettle/PyETL/py_sh/PyClearLog.sh
#上面写的shell脚本:可以写多少,实现并行
03 00 * * * sh /home/kettle/PyETL/py_sh/py1.sh
04 00 * * * sh /home/kettle/PyETL/py_sh/py2.sh

四、目录说明:

tree PyETL/
PyETL/
├── CheckETLRecord.sh  #监控脚本
监控脚本:异常输出说明:
                       表  |D:目标(S:源):少300条记录
                       test|D:-300
├── py_CheckRecord     #数据验证目录
│   ├── CheckRecord    #数据验证日志输出
├── py_conf            #配置目录
│   ├── config1.ini    #配置文件01
│   ├── config2.ini    #配置文件02
├── py_CsvDat          #按日期目录存储将数据以csv格式存放。
│   └── 2022-02-28    #导入成功会删除,导入失败还会存在,为空代表全部成功导入
├── py_log            #日志输出目录
│   └── 2022-02-28    #按日期存放
│       ├── Log1      #并行1日志文件
│       │   ├── py_etl_finish.log #操作成功日志
│       │   ├── py_etl.log        #操作全部日志
│       │   └── py_etl_warning.log #操作报警日志
│       ├── Log2                   #操作成功日志
│       │   ├── py_etl_finish.log
│       │   ├── py_etl.log
│       │   └── py_etl_warning.log
│       └── PyClearLog.log   #每天操作的日志清理日志
├── py_main
│   └── Main.py  #主程序代码
├── py_sh        #shell 代码目录
│   ├── py1.sh   #shell 脚本里调用python程序
│   ├── py2.sh
│   └── PyClearLog.sh #日志清理脚本
└── py_tool
    ├── DataBase.py  #数据库操作代码
    ├── DB_Conn.py   #数据库连接池
    ├── Log.py       #日志代码

五、执行:

               配置文件     日志文件名	
python3 Main.py config1.ini Log1

六、代码下载:

python实现Oracle/MysqlETl导入greenplum数据库。-Linux文档类资源-CSDN文库

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1、脚本运行环境python3.6 2、脚本忽略LOB字段数据 3、脚本生成以^为分割符的csv格式文件 4、脚本避免转义字符将‘\’替换为‘/’,数据中存在分割符:^转换为# 5、特殊字符处理:删除:'\u0000','"',oracle数据回车符:'\r','\n' 6、支持按分区导入 7、支持内存处理数据导入greenplum,导入失败生成csv格式文件,方便排错 8、支持生成csv格式文件导入greenplum。 9、传递不同配置文件,多次执行达到并行处理(注意内存溢出) 例: 执行脚本 生成日志目录 配置文件 python3 Main_Mem.py ProcessLog1 config1.ini & python3 Main_Mem.py ProcessLog2 config2.ini & python3 Main_Mem.py ProcessLog3 config3.ini & python3 Main_Mem.py ProcessLog4 config4.ini & 10、采用python 中的copy_from方法实现导入greenplum 11、各目录用途: conf :存放配置文件 etl_dat: 存放导出数据 log :存放输出日志 py_tool 存放编写工具脚本: DBconn: 数据库连接池配置及查询返回方法 DumpCsv:导出csv文件方法 Log:日志输出方法 DataBase:判断表是否存在、表或分区表是否有数据、是否为分区表、数据导出、表分区遍历、指定分区表导出等方法 py_main:主程序目录: Main_Mem.py:主程序目录: 运行:python3 Main_Mem.py ProcessLog1 config.ini 12、主程序需要修改目录参数: if __name__ == '__main__': #引用编写的包 sys.path.append('/home/oracle/PyETL2.0/py_tool') import Log,DataBase,DumpCsv #输出日志路径: path = '/home/oracle/PyETL2.0/log/'+sys.argv[1] isExists = os.path.exists(path) if not isExists: os.makedirs(path) #shutil.move(path,path+) logger = Log.log(path) #读取配置文件 config = Confile('/home/oracle/PyETL2.0/conf/', sys.argv[2]) 13、后期还会更新,欢迎提供宝贵意见。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

two_rain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值