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简明入门教程
Aug 04 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
分享一个可以生成各种进制格式IP的小工具实例代码
Jul 28 Python
Python重新加载模块的实现方法
Oct 16 Python
python+OpenCV实现图像拼接
Mar 05 Python
python库skimage给灰度图像染色的方法示例
Apr 27 Python
python爬虫可以爬什么
Jun 16 Python
如何解决安装python3.6.1失败
Jul 01 Python
基于selenium及python实现下拉选项定位select
Jul 22 Python
python实现批处理文件
Jul 28 Python
Python djanjo之csrf防跨站攻击实验过程
May 14 Python
python绘制简单直方图(质量分布图)的方法
Apr 21 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
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
php 随机生成10位字符代码
2009/03/26 PHP
PHP SPL标准库之接口(Interface)详解
2015/05/11 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
PHP框架Laravel学习心得体会
2015/10/28 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
PHP+Ajax异步带进度条上传文件实例
2016/11/01 PHP
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
Jquery数独游戏解析(一)-页面布局
2010/11/05 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
JS 实现导航栏悬停效果(续2)
2013/09/24 Javascript
JQuery事件e参数的方法preventDefault()取消默认行为
2013/09/26 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
js设置document.domain实现跨域的注意点分析
2015/05/21 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
2017/03/01 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
基于JavaScript定位当前的地理位置
2017/04/11 Javascript
简单谈谈axios中的get,post方法
2017/06/25 Javascript
Vue 递归多级菜单的实例代码
2019/05/05 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
python中模块查找的原理与方法详解
2017/08/11 Python
在Python web中实现验证码图片代码分享
2017/11/09 Python
Python迭代器定义与简单用法分析
2018/04/30 Python
Python hashlib模块用法实例分析
2018/06/12 Python
Windows下python3.7安装教程
2018/07/31 Python
夜班门卫岗位职责
2013/12/09 职场文书
初三化学教学反思
2014/01/23 职场文书
活动总结书
2014/05/08 职场文书
教育见习报告范文
2014/11/03 职场文书
2015年惩防体系建设工作总结
2015/05/22 职场文书
信仰纪录片观后感
2015/06/08 职场文书
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS
JavaScript实现优先级队列
2021/12/06 Javascript
python 判断文件或文件夹是否存在
2022/03/18 Python