在PyODPS DataFrame自定义函数中使用pandas、scipy和scikit-learn

简介: 背景 [PyODPS DataFrame]http://pyodps.readthedocs.io/zh_CN/latest/) 提供了类似 pandas 的接口,来操作 ODPS 数据,同时也支持在本地使用 pandas,和使用数据库来执行。

背景

PyODPS DataFrame 提供了类似 pandas 的接口,来操作 ODPS 数据,同时也支持在本地使用 pandas,和使用数据库来执行

PyODPS DataFrame 除了支持类似 pandas 的 mapapply 方法,也提供了 MapReduce API 来扩展 pandas 语法以适应大数据环境。

PyODPS 的自定义函数是序列化到 MaxCompute 上执行的,MaxCompute 的 Python 环境只包含了 numpy 这一个第三方包,用户常常问的问题是,如何在自定义函数里使用 pandas、scipy 或者 scikit-learn 这样的包含c代码的库?

现在,MaxCompute 在 sprint 27 及更高版本的 isolation,让在自定义函数中使用这些包成为可能。同时,
PyODPS也需要至少0.7.4版本 。接下来我会详细介绍使用步骤。

步骤

上传第三方包(只需做一次)

这个步骤只需要做一次,当 MaxCompute 资源里有了这些包,这一步直接跳过。

现在这些主流的 Python 包都提供了 whl 包,提供了各平台包含二进制文件的包,因此找到能在 MaxCompute 上能运行的包是第一步。

其次,要想在 MaxCompute 上运行,需要包含所有的依赖包,这个是比较繁琐的。我们可以看下各个包的依赖情况(删除表示已经包含)

包名 依赖
pandas numpy, python-dateutil, pytz, six
scipy numpy
scikit-learn numpy, scipy

所以,我们一共需要上传 python-dateutil、pytz、pandas、scipy、sklearn、six 这六个包,就能保证 pandas、scipy 和 scikit-learn 可用。

我们直接通过 http://mirrors.aliyun.com/pypi/simple 来找包。首先是 python-dateutils:http://mirrors.aliyun.com/pypi/simple/python-dateutil/ 。我们找到最新版,这个包是纯 Python 的包,我们找到最新版的 zip 包,python-dateutil-2.6.0.zip,下载。

WangWang20170621111739.png

重命名为 python-dateutil.zip,通过 MaxCompute Console 上传资源。

add archive python-dateutil.zip;

pytz 一样,找到 pytz-2017.2.zip。上传不表。

six 找到 six-1.11.0.tar.gz

接下来,是pandas,对于这种包含c的包,我们一定要找 名字中包含cp27-cp27m-manylinux1_x86_64 的whl包,这样才能在 MaxCompute 上正确执行。因此,这样我们找到最新版的包是:pandas-0.20.2-cp27-cp27m-manylinux1_x86_64.whl

这里我们把后缀改成zip,上传。

add archive pandas.zip;

其他包也是一样,因此,我们把它们都列出来:

包名 文件名 上传资源名
python-dateutil python-dateutil-2.6.0.zip python-dateutil.zip
pytz pytz-2017.2.zip pytz.zip
six six-1.11.0.tar.gz six.tar.gz
pandas pandas-0.20.2-cp27-cp27m-manylinux1_x86_64.zip pandas.zip
scipy scipy-0.19.0-cp27-cp27m-manylinux1_x86_64.zip scipy.zip
scikit-learn scikit_learn-0.18.1-cp27-cp27m-manylinux1_x86_64.zip sklearn.zip

至此,全部包上传都已完成。

当然,我们全部上传也可以使用 PyODPS 的资源上传接口来完成,同样只需要操作一遍即可。至于用哪个,看个人喜好了。

编写代码验证

我们写一个简单的函数,里面用到了所有的库,最好是在函数里来 import 这些第三方库。

def test(x):
    from sklearn import datasets, svm
    from scipy import misc
    import numpy as np

    iris = datasets.load_iris()
    assert iris.data.shape == (150, 4)
    assert np.array_equal(np.unique(iris.target),  [0, 1, 2])

    clf = svm.LinearSVC()
    clf.fit(iris.data, iris.target)
    pred = clf.predict([[5.0, 3.6, 1.3, 0.25]])
    assert pred[0] == 0

    assert misc.face().shape is not None

    return x

这段代码只是示例,目标是用到以上所说的所有的包。

写完函数后,我们写一个简单的 map,记住, 运行时要确保 isolation 打开 ,如果不在 project 级别打开,可以在运行时打开,一个可以设置全局的选项:

from odps import options

options.sql.settings = {'odps.isolation.session.enable': True}

也可以在 execute 方法上指定本次执行打开 isolation。

同样,我们可以在全局通过 options.df.libraries 指定用到的包,也可以在 execute 时指定。这里,我们要指定所有的包,包括依赖。下面就是调用刚刚定义的函数的例子。

hints = {
    'odps.isolation.session.enable': True
}
libraries = ['python-dateutil.zip', 'pytz.zip', 'six.tar.gz', 'pandas.zip', 'scipy.zip', 'sklearn.zip']

iris = o.get_table('pyodps_iris').to_df()

print iris[:1].sepal_length.map(test).execute(hints=hints, libraries=libraries)

可以看到,我们的函数顺利执行。

总结

对于要用到的第三方库及其依赖,如果已经上传,则可以直接编写代码,并指定用到的 libraries 即可;否则,需要按照教程上传第三方库。

可以看到,当第一步上传包做过后,以后每次使用都是优雅的,只需指定 libraries 就可以了。

PyODPS 相关资源

028df8ba14c11b8a5ea8c71eaad0d5e6fcd6dafc_jpeg

MaxCompute 钉钉群

image

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps 
目录
相关文章
|
14天前
|
SQL 数据库 索引
Pandas之DataFrame,快速入门,迅速掌握(三)
Pandas之DataFrame,快速入门,迅速掌握(三)
|
14天前
|
数据采集 索引 Python
Pandas之DataFrame,快速入门,迅速掌握(二)
Pandas之DataFrame,快速入门,迅速掌握(二)
|
11天前
|
Python
使用Python pandas的sort_values()方法可按一个或多个列对DataFrame排序
使用Python pandas的sort_values()方法可按一个或多个列对DataFrame排序。示例代码展示了如何按'Name'和'Age'列排序 DataFrame。先按'Name'排序,再按'Age'排序。sort_values()的by参数接受列名列表,ascending参数控制排序顺序(默认升序),inplace参数决定是否直接修改原DataFrame。
23 1
|
11天前
|
NoSQL Serverless Python
在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。
在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。方法一是直接赋值,如`df['C'] = 0`,创建新列C并初始化为0。方法二是应用函数,例如定义`add_column`函数计算A列和B列之和,然后使用`df.apply(add_column, axis=1)`,使C列存储每行A、B列的和。
38 0
|
11天前
|
Python
在Pandas中,利用boolean indexing可按条件过滤DataFrame
【5月更文挑战第2天】在Pandas中,利用boolean indexing可按条件过滤DataFrame。通过&(和)和|(或)操作符可基于多个条件筛选。
19 1
|
14天前
|
编译器 索引 Python
Pandas之DataFrame,快速入门,迅速掌握(一)
Pandas之DataFrame,快速入门,迅速掌握(一)
|
17天前
|
数据采集 数据处理 索引
如何使用 Pandas 删除 DataFrame 中的非数字类型数据?
如何使用 Pandas 删除 DataFrame 中的非数字类型数据?
27 3
|
13天前
|
数据采集 分布式计算 DataWorks
DataWorks产品使用合集之DataWorks 数据集成中的数据源管理和管理空间的数据源之间的关系是怎样的
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
24 0
|
13天前
|
运维 DataWorks 关系型数据库
DataWorks产品使用合集之DataWorks中如何提升运维中心实时同步任务的运行速度
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
25 1
|
13天前
|
SQL JSON 分布式计算
DataWorks产品使用合集之DataWorks一键maxcompute数据同步的操作步骤是什么
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
23 0

热门文章

最新文章

相关实验场景

更多