在 MaxCompute UDF 中运行 Scipy

maoer · · 650 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

摘要: 新版 MaxCompute Isolation Session 支持 Python UDF。也就是说,Python UDF 中已经可以跑二进制包。刚才以 Scipy 为例踩了一下坑,把相关的过程分享出来。 新版 MaxCompute Isolation Session 支持 Python UDF。也就是说,Python UDF 中已经可以跑二进制包。刚才以 Scipy 为例踩了一下坑,把相关的过程分享出来。 下载 Scipy 包并上传资源 首先,从 PyPI 或其他镜像下载 Scipy 包。你需要下载后缀为“cp27-cp27m-manylinux1_x86_64.whl”的包,其他的包会无法加载,包括名为“cp27-cp27mu”的包。以下的截图来自 https://pypi.python.org/pypi/scipy ,仅有打勾的包可以直接使用: ![74399e124cf1d44b8d68ccfde851ff341e405a7f.png](https://static.studygolang.com/180517/f64d3c1b0fa256d620f61ed427672524.png) 下载 whl 后,将文件名更改为 scipy.zip。此后,在 MaxCompute Console 中执行 add archive scipy.zip; 此后,scipy.zip 即被创建为 MaxCompute Archive 资源。不建议使用其他类型的资源,因为在执行时,MaxCompute 会自动解压 Archive 类型的资源,从而省去手动解压的步骤。 从非 Whl 包生成 Whl 包 如果列出的包中包含 Whl,则可以直接上传并跳过此步骤。如果列出的包不包含 whl(如手中仅有图中的 scipy-0.19.0.zip),需要在 Linux 环境中手动编译并打包为 whl。打包前,需要确保下列命令返回“cp27m”而不是“cp27mu”: python -c "import pip; print pip.pep425tags.get_abi_tag()" 如果返回值为“cp27mu”,你需要使用 “--enable-unicode=no" 选项编译一个可用的 Python 2.7,再使用编译得到的 Python。如果返回值正确,通常可以在该环境下使用 python setup.py bdist_wheel 完成,具体请参考各个包的编译/安装说明。 打包完成后,将生成的 whl 包上传。 编写和创建 UDF 我们需要编写一个 UDF 支持计算 psi。编写下列代码: from odps.udf import annotate from odps.distcache import get_cache_archive def include_package_path(res_name): import os, sys archive_files = get_cache_archive(res_name) dir_names = sorted([os.path.dirname(os.path.normpath(f.name)) for f in archive_files if '.dist_info' not in f.name], key=lambda v: len(v)) sys.path.append(os.path.dirname(dir_names[0])) @annotate("double->double") class MyPsi(object): def __init__(self): include_package_path('scipy.zip') def evaluate(self, arg0): from scipy.special import psi return float(psi(arg0)) 这里有必要解释一下 include_package_path 这个函数。get_cache_archive 返回一个包含包中所有文件的文件对象。我们首先取出所有的文件名,此后获得最短的路径作为包的路径,并加入 sys.path。此后,便可以正常 import scipy 这个包。 需要注意的是,因为 MaxCompute 会在执行前通过原有的沙箱检查 UDF 的输入/输出,因而 include_package_path 和 import 在函数外调用会报错。 编写完成后,将代码保存为 my_psi.py,并在 MaxCompute Console 中执行 add py my_psi.py; 此后创建函数。在 MaxCompute Console 中输入 create function my_psi as my_psi.MyPsi using my_psi.py,scipy.zip; 注意在 create function 时,不要忘记加上刚才上传的包,例如上面的 scipy.zip。 执行 创建 UDF 后,便可以在 MaxCompute Console 中执行查询(暂不支持 pypy,因而需禁用 pypy): set odps.pypy.enabled=false; set odps.isolation.session.enable = true; select my_psi(sepal_length) from iris; 其他 如果包依赖了其他 Python 包,需要一并上传并同时加入到 UDF 依赖中。 使用 0.7.4 以上的 PyODPS DataFrame 可以简化使用二进制包的 UDF 的编写,无需手动调用 include_package_path,具体可见 http://pyodps.readthedocs.io/zh_CN/latest/df-element-zh.html#third-party-library 。

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

650 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传