专栏首页python3pygrametl的使用--python

pygrametl的使用--python

pygrametl是一个python的package用于ETL(Extract-Transform-Load )

简例

import MySQLdb from pygrametl.datasources import SQLSource conn = MySQLdb.connect(host="localhost", user="root", passwd="123456", db="ustcck", charset="utf8") sql = "SELECT * FROM student;" newnames = 'ID', 'Name', 'Gender' resultsSource = SQLSource(connection=conn, query=sql, names=newnames) print type(resultsSource) for row in resultsSource:     print row     print row["Name"]

1.安装以及安装测试

$ pip install pygrametl

>>> import pygrametl >>>

ok了!

2.pygrametl 支持多种数据源

'BackgroundSource', 'CSVSource', 'CrossTabbingSource', 'DictReader', 'DynamicForEachSource', 'FilteringSource', 'HashJoiningSource', 'JoiningSource', 'MergeJoiningSource', 'Process', 'ProcessSource', 'Queue', 'RoundRobinSource', 'SQLSource', 'TransformingSource', 'TypedCSVSource', 'UnionSource'..........

如:

(1)

import psycopg2 import pygrametl from pygrametl.datasources import SQLSource conn = psycopg2.connect(database="db", user="dbuser", password="dbpass") sql = "SELECT * FROM table;" resultsSource = SQLSource(connection=conn, query=sql)

(2)

import pygrametl from pygrametl.datasources import CSVSource resultsSource = CSVSource(csvfile=open('ResultsFile.csv', 'r', 16384), delimiter=',')

3.Dimension(维度)

pygrametl 提供了数据仓库维度交互,提供了一个在table中执行增删改查操作的接口。

使用Dimension两步走:

(1)创建ConnectionWrapper

(2)必须指定table的名字,key以及表中其他的列

下面是一个使用Dimension将相应的数据的插入到对应维度的操作的例子:(假设table已经存在,维度有'productid', 'name', 'category', 'price')

import psycopg2 import pygrametl from pygrametl.tables import Dimension

products = [     {'name' : 'Calvin and Hobbes 1', 'category' : 'Comic', 'price' : '10'},     {'name' : 'Calvin and Hobbes 2', 'category' : 'Comic', 'price' : '10'},     {'name' : 'Calvin and Hobbes 3', 'category' : 'Comic', 'price' : '10'},     {'name' : 'Cake and Me', 'category' : 'Cookbook', 'price' : '15'},     {'name' : 'French Cooking', 'category' : 'Cookbook', 'price' : '50'},     {'name' : 'Sushi', 'category' : 'Cookbook', 'price' : '30'},     {'name' : 'Nineteen Eighty-Four', 'category' : 'Novel', 'price' : '15'},     {'name' : 'The Lord of the Rings', 'category' : 'Novel', 'price' : '60'} ] pgconn = psycopg2.connect("""host='localhost' dbname='dw' user='dwuser'                           password='dwpass'""") conn = pygrametl.ConnectionWrapper(connection=pgconn) productDimension = Dimension(     name='product',     key='productid',     attributes=['name', 'category', 'price'],     lookupatts=['name']) for row in products:     productDimension.insert(row) conn.commit() conn.close()

4.FactTable。给个例子你就知道了

例:

三步走:

(1)建立一个connection

(2)创建一个ConnectionWrapper实例

(3)创建 FactTable

import MySQLdb import pygrametl from pygrametl.tables import FactTable conn = MySQLdb.connect(host="localhost", user="root", passwd="123", db="ustcck", charset="utf8") conn = pygrametl.ConnectionWrapper(connection=conn) factTable = FactTable(     name='facttable',     measures=['price'],     keyrefs=['storeid', 'productid', 'dateid']) # A list of facts are ready to inserted into the fact table facts = [{'storeid': 1, 'productid': 13, 'dateid': 4, 'price': 50},          {'storeid': 2, 'productid': 7, 'dateid': 4, 'price': 75},          {'storeid': 1, 'productid': 7, 'dateid': 4, 'price': 50},          {'storeid': 3, 'productid': 9, 'dateid': 4, 'price': 25}] # The facts can be inserted using the insert method, before committing to DB for row in facts:     factTable.insert(row) conn.commit() # Lookup retunes all both keys and measures given only the keys factTable.lookup({'storeid': 1, 'productid': 13, 'dateid': 4}) # If a set of facts contain facts already existing in the database can the # ensure method be used instead of calling lookup and insert manually, we # also rename 'itemid' to 'productid' using the name mapping feature newFacts = [{'storeid': 2, 'itemid': 7, 'dateid': 4, 'price': 75},             {'storeid': 1, 'itemid': 7, 'dateid': 4, 'price': 50},             {'storeid': 1, 'itemid': 2, 'dateid': 7, 'price': 150},             {'storeid': 3, 'itemid': 3, 'dateid': 6, 'price': 100}] for row in newFacts:     # The second argument forces FactTable.ensure to not only match the keys     # for facts to be considered equal, but also checks if the measures are     # the same for facts with the same key, and if not raises a ValueError     factTable.ensure(row, True, {'productid': 'itemid'}) conn.commit() conn.close()

5.Bulk Loading(大面积载入数据)

三个类可以用于Bulk Loading: BulkDimension, BulkFactTable, and CachedBulkDimension

#MySQLdb def mysqlbulkloader(name, attributes, fieldsep, rowsep, nullval, filehandle):     global connection     cursor = connection.cursor()     sql = "LOAD DATA LOCAL INFILE '%s' INTO TABLE %s FIELDS TERMINATED BY '%s' LINES TERMINATED BY '%s' (%s);" % \             (filehandle, name, fieldsep, rowsep, ', '.join(attributes))     cursor.execute(sql)

参数含义:Parameters name – 表名 attributes –属性序列列表 fieldsep – 属性分隔符 rowsep – row分隔符 nullval – null的替代 filehandle – 文件名或者文件对象

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python求积分(定积分)

    py3study
  • Python 学习笔记 - 操作MySQ

    学习Python模块之前,首先看看MySQL的基本安装和使用,具体语法可以参考豆子之前的博客http://beanxyz.blog.51cto.com/5570...

    py3study
  • python模块导入

    [seemmo@RegionServer1 duwen]$ python Python 2.6.6 (r266:84292, Nov 22 2013, 12:1...

    py3study
  • SpringBoot 实战 (八) | 使用 Spring Data JPA 访问 Mysql 数据库

    在介绍 Spring Data JPA 之前,首先介绍 Hibernate 。 Hibernate 使用 O/R 映射 (Object-Relation Map...

    一个优秀的废人
  • 详解JavaScript对象继承方式

    其原理如下:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式)。因为构造函数只是一个函数,所以可使 Parent 构造函数 成为 ...

    用户6167509
  • 【 文智背后的奥秘 】系列篇 : 分布式爬虫之 WebKit

    WebKit 是由 Apple 公司开发的开源浏览器内核,WebKit 主要分为三个模块:WebCore、JavaScriptCore、平台应用相关Port。相...

    文智
  • 一文读懂如何在 Kubernetes 上轻松实现自动化部署 Prometheus

    Prometheus 是当下火热的监控解决方案,尤其是容器微服务架构,Kubernetes 的首选监控方案。关于为什么要用 Prometheus,我这里就不多讲...

    iMike
  • 一文读懂如何在 Kubernetes 上轻松实现自动化部署 Prometheus

    Prometheus 是当下火热的监控解决方案,尤其是容器微服务架构,Kubernetes 的首选监控方案。关于为什么要用 Prometheus,我这里就不多讲...

    kubernetes中文社区
  • Kafka 中使用 Avro 序列化框架(二):使用 Twitter 的 Bijection 类库实现 avro 的序列化与反序列化

    使用传统的 avro API 自定义序列化类和反序列化类比较麻烦,需要根据 schema 生成实体类,需要调用 avro 的 API 实现 对象到 byte[]...

    CoderJed
  • Vue开发微信H5页面总结

    刚入门前端的时候写过很多的微信H5页面,时隔多年感觉应该是手到擒来,不曾想竟很是费了一些功夫。现在把本次开发过程中遇到的问题以及我是如何解决的,做个记录。防止自...

    前端黑板报

扫码关注云+社区

领取腾讯云代金券