博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PyODPS DataFrame:统一的数据查询语言
阅读量:5998 次
发布时间:2019-06-20

本文共 2383 字,大约阅读时间需要 7 分钟。

  hot3.png

摘要: 前几天,PyODPS发布了0.7版本,这篇文章给大家介绍下PyODPS新版本带来的重要特性。 之前也有若干篇文章介绍过了,我们PyODPS DataFrame是延迟执行的,在调用立即执行的方法,比如execute、persist等之前,都只是构建了表达式。

点此查看原文:

前几天,PyODPS发布了0.7版本,这篇文章给大家介绍下PyODPS新版本带来的重要特性。

之前也有若干篇文章介绍过了,我们PyODPS DataFrame是延迟执行的,在调用立即执行的方法,比如execute、persist等之前,都只是构建了表达式。而真正的执行根据具体的输入数据,来决定执行的后端。

比如,我们可以根据输入是pandas DataFrame(本地数据),还是MaxCompute Table(MaxCompute数据)来决定是在本地执行,还是在MaxComput上执行。

In [1]: import pandas as pdIn [2]: pd_df = pd.DataFrame({'a': range(3)})In [3]: from odps.df import DataFrameIn [4]: df = DataFrame(pd_df)  # 本地数据In [5]: df.a.sum()|==========================================|   1 /  1  (100.00%)         0s3In [6]: %load_ext odpsIn [7]: %enterOut[7]: 
In [8]: df = DataFrame(o.get_table('pyodps_iris')) # MaxCompute数据In [9]: df.sepal_width.sum()|==========================================| 1 / 1 (100.00%) 15s458.10000000000014

数据库执行

来到了0.7版本,我们的后端武器库进一步扩充,现在我们支持Postgresql和MySQL,原则上我们支持所有的主流数据库,但我们只在这两个数据库上做了测试。

我们的数据库执行后端使用 sqlalchemy 实现,想要执行还需要对应数据库的driver。

现在,如果DataFrame输入的数据是sqlalchemy Table,那么我们就可以使用数据库后端来执行。

In [24]: mysql_engine = sqlalchemy.create_engine('mysql://root:123@localhost/movielens') In [25]: metadata = sqlalchemy.MetaData(bind=mysql_engine)   # 需要绑定engineIn [26]: table = sqlalchemy.Table('top_users', metadata, extend_existing=True, autoload=True)In [27]: top_users = DataFrame(table)In [28]: top_users.age.sum()|==========================================|   1 /  1  (100.00%)         0s763

对于postgresql也是一样。 值得注意的是,现在还有部分DataFrame操作,比如自定义函数尚未支持数据库后端 

可以看到,PyODPS DataFrame就是一个统一的数据查询语言,用户不需要改写一行代码,就可以根据输入让数据在MaxCompute、本地和数据库上执行,由于DataFrame框架的灵活性,我们甚至还可以扩展出非SQL执行后端的支持。

JOIN或者UNION数据库和MaxCompute数据

过去  提到过,我们可以join或者union本地和MaxCompute上的数据,这样的典型场景就是,比如我有个本地excel文件,我可以轻松读取成本地DataFrame,然后直接就可以和MaxCompute数据进行操作,省去了一大堆麻烦的过程。

现在,我们也同样可以join 数据库和MaxCompute上的数据,试想,有一堆用户数据是在数据库中进行处理,然后我们无需经过同步数据等繁琐的过程,我们就可以直接join 数据库和MaxCompute上的数据,这是何其方便的事情。

比如:

In [29]: ratings = o.get_table('movielens_ratings').to_df()In [32]: female_top_users = top_users[top_users.sex == 'F']  # MySQL中的数据In [33]: ratings.join(female_top_users).rating.mean()|==========================================|   1 /  1  (100.00%)        14s2.9451170298627924

总结

我们PyODPS一直处在快速迭代的过程中,我们所有所做的努力,都是为了让大家以更好的体验来进行数据分析和机器学习。尽管我们很努力,但精力毕竟有限,难免会有bug,会有功能不完善。希望大家能给我们提issue,能贡献代码就更好啦。

项目文档:

项目地址:
提issue:
钉钉扫码:
IMG_3110

转载于:https://my.oschina.net/yunqi/blog/1613511

你可能感兴趣的文章
入门级----黑盒测试、白盒测试、手工测试、自动化测试、探索性测试、单元测试、性能测试、数据库性能、压力测试、安全性测试、SQL注入、缓冲区溢出、环境测试...
查看>>
composer 安装 ubuntu 12.04
查看>>
微服务(二)hystrix
查看>>
Performing a thread dump in Linux or Windows--reference
查看>>
推荐系统中常用算法 以及优点缺点对比
查看>>
cocos2d-x v3.2环境配置(现在3.x版本号可以配置该)
查看>>
穷举法解决旅行商问题
查看>>
括号配对问题
查看>>
Oracle自学笔记(一)
查看>>
JNI- java.lang.UnsatisfiedLinkError: Native method not found
查看>>
利用5w1h写出高效的git commit
查看>>
mysql中的日期处理 计算 字符串截取
查看>>
用div和css样式控制页面布局
查看>>
Python自定义库文件路径
查看>>
Java 面试基础问题集1
查看>>
UIDatePicker扩展支持年月日时分选择
查看>>
Java --并发--继续 第五弹--闭锁
查看>>
卸载Php
查看>>
Get和Post的区别
查看>>
Redis--优化
查看>>