python ETL工具 pyetl


Posted in Python onJune 07, 2020

pyetl是一个纯python开发的ETL框架, 相比sqoop, datax 之类的ETL工具,pyetl可以对每个字段添加udf函数,使得数据转换过程更加灵活,相比专业ETL工具pyetl更轻量,纯python代码操作,更加符合开发人员习惯

安装

pip3 install pyetl

使用示例

数据库表之间数据同步

from pyetl import Task, DatabaseReader, DatabaseWriter
reader = DatabaseReader("sqlite:///db1.sqlite3", table_name="source")
writer = DatabaseWriter("sqlite:///db2.sqlite3", table_name="target")
Task(reader, writer).start()

数据库表到hive表同步

from pyetl import Task, DatabaseReader, HiveWriter2
reader = DatabaseReader("sqlite:///db1.sqlite3", table_name="source")
writer = HiveWriter2("hive://localhost:10000/default", table_name="target")
Task(reader, writer).start()

数据库表同步es

from pyetl import Task, DatabaseReader, ElasticSearchWriter
reader = DatabaseReader("sqlite:///db1.sqlite3", table_name="source")
writer = ElasticSearchWriter(hosts=["localhost"], index_name="tartget")
Task(reader, writer).start()

原始表目标表字段名称不同,需要添加字段映射

添加

# 原始表source包含uuid,full_name字段
reader = DatabaseReader("sqlite:///db.sqlite3", table_name="source")
# 目标表target包含id,name字段
writer = DatabaseWriter("sqlite:///db.sqlite3", table_name="target")
# columns配置目标表和原始表的字段映射关系
columns = {"id": "uuid", "name": "full_name"}
Task(reader, writer, columns=columns).start()

字段的udf映射,对字段进行规则校验、数据标准化、数据清洗等

# functions配置字段的udf映射,如下id转字符串,name去除前后空格
functions={"id": str, "name": lambda x: x.strip()}
Task(reader, writer, columns=columns, functions=functions).start()

继承Task类灵活扩展ETL任务

import json
from pyetl import Task, DatabaseReader, DatabaseWriter

class NewTask(Task):
  reader = DatabaseReader("sqlite:///db.sqlite3", table_name="source")
  writer = DatabaseWriter("sqlite:///db.sqlite3", table_name="target")
  
  def get_columns(self):
    """通过函数的方式生成字段映射配置,使用更灵活"""
    # 以下示例将数据库中的字段映射配置取出后转字典类型返回
    sql = "select columns from task where name='new_task'"
    columns = self.writer.db.read_one(sql)["columns"]
    return json.loads(columns)
   
  def get_functions(self):
    """通过函数的方式生成字段的udf映射"""
    # 以下示例将每个字段类型都转换为字符串
    return {col: str for col in self.columns}
   
  def apply_function(self, record):
    """数据流中对一整条数据的udf"""
    record["flag"] = int(record["id"]) % 2
    return record

  def before(self):
    """任务开始前要执行的操作, 如初始化任务表,创建目标表等"""
    sql = "create table destination_table(id int, name varchar(100))"
    self.writer.db.execute(sql)
  
  def after(self):
    """任务完成后要执行的操作,如更新任务状态等"""
    sql = "update task set status='done' where name='new_task'"
    self.writer.db.execute(sql)

NewTask().start()

目前已实现Reader和Writer列表

 

Reader 介绍
DatabaseReader 支持所有关系型数据库的读取
FileReader 结构化文本数据读取,如csv文件
ExcelReader Excel表文件读取

Writer 介绍
DatabaseWriter 支持所有关系型数据库的写入
ElasticSearchWriter 批量写入数据到es索引
HiveWriter 批量插入hive表
HiveWriter2 Load data方式导入hive表(推荐)
FileWriter 写入数据到文本文件

项目地址pyetl

总结

到此这篇关于python ETL工具 pyetl的文章就介绍到这了,更多相关python ETL工具 pyetl内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python的tkinter布局之简单的聊天窗口实现方法
Sep 03 Python
用Python登录Gmail并发送Gmail邮件的教程
Apr 17 Python
在Python中操作时间之tzset()方法的使用教程
May 22 Python
Python 列表(List) 的三种遍历方法实例 详解
Apr 15 Python
Python实现删除文件中含“指定内容”的行示例
Jun 09 Python
Django 浅谈根据配置生成SQL语句的问题
May 29 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
Dec 10 Python
Python 旋转打印各种矩形的方法
Jul 09 Python
如何让PyQt5中QWebEngineView与JavaScript交互
Oct 21 Python
完美处理python与anaconda环境变量的冲突问题
Apr 07 Python
Python OpenCV实现图像模板匹配详解
Apr 07 Python
python框架flask入门之路由及简单实现方法
Jun 07 #Python
python框架flask入门之环境搭建及开启调试
Jun 07 #Python
python实现一次性封装多条sql语句(begin end)
Jun 06 #Python
python 在sql语句中使用%s,%d,%f说明
Jun 06 #Python
解决python 执行sql语句时所传参数含有单引号的问题
Jun 06 #Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
Jun 06 #Python
python 解决mysql where in 对列表(list,,array)问题
Jun 06 #Python
You might like
简单的方法让你的后台登录更加安全(php中加session验证)
2012/08/22 PHP
Php output buffering缓存及程序缓存深入解析
2013/07/15 PHP
php使用多个进程同时控制文件读写示例
2014/02/28 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
2015/03/19 PHP
PHP实现将标点符号正则替换为空格的方法
2017/08/09 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
2018/04/20 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
2019/09/18 PHP
通过PHP实现获取访问用户IP
2020/05/09 PHP
jquery 简单的进度条实现代码
2010/03/11 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
javascript基本语法
2016/05/31 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
动态加载、移除js/css文件的示例代码
2018/03/20 Javascript
Vue.js的模板语法详解
2020/02/16 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
Python Numpy库安装与基本操作示例
2019/01/08 Python
Python的互斥锁与信号量详解
2019/09/12 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
python 两个一样的字符串用==结果为false问题的解决
2020/03/12 Python
python 串行执行和并行执行实例
2020/04/30 Python
python 19个值得学习的编程技巧
2020/08/15 Python
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
电子商务专业学生职业生涯规划
2014/03/07 职场文书
爱心活动计划书
2014/04/26 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
创业计划书之美甲店
2019/09/20 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript