本文向您介绍如何在PyODPS DataFrame自定义函数中上传和使用pandas、scipy和scikit-learn第三方包。
PyODPS DataFrame提供了类似pandas的接口来操作MaxCompute数据,同时也支持在本地使用pandas和使用数据库来执行。
PyODPS DataFrame不仅支持类似pandas的map和apply方法,也提供了MapReduce API来扩展pandas语法以适应大数据环境。
PyODPS的自定义函数是序列化到MaxCompute上执行,MaxCompute的Python环境仅包含numpy第三方包。现在,MaxCompute可以实现在自定义函数中使用pandas、scipy或scikit-learn等包含c代码的库。
PyODPS需要0.7.4及以上版本 。
上传第三方包
您只需上传一次第三方包,当MaxCompute资源有了这些包,可直接跳过此步。
现在主流的Python包都提供了whl包,提供了各平台包含二进制文件的包,因此找到可以在MaxCompute上运行的包是第一步。
其次,要想在MaxCompute上运行,需要包含所有的依赖包,这个是比较繁琐的。各个包的依赖情况如下表所示。
包名 | 依赖 |
pandas | numpy,python-dateutil,pytz,six |
scipy | numpy |
scikit-learn | numpy,scipy |
其中numpy已包含,您只需上传python-dateutil、pytz、pandas、scipy、sklearn、six包,pandas、scipy和scikit-learn即可使用。
您可进入python-dateutils找到python-dateutil-2.6.0.zip进行下载。
重命名为python-dateutil.zip,通过MaxCompute Console上传资源。
add archive python-dateutil.zip;pytz和six的上传方式同上,分别找到 pytz-2017.2.zip和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,在MaxCompute Console中执行add archive pandas.zip;进行上传。
其他包的操作同上,需下载资源如下表所示。
包名 | 文件名 | 上传资源名 |
python-dateutil | python-dateutil.zip | |
pytz | pytz.zip | |
six | six.tar.gz | |
pandas | pandas.zip | |
scipy | scipy.zip | |
scikit-learn | 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即可。否则,需要按照上述操作上传第三方库。
PyODPS相关资源
相关文档请参见PyODPS使用指南。
相关代码请参见aliyun-odps-python-sdk。