资讯专栏INFORMATION COLUMN

在 MaxCompute UDF 中运行 Scipy

kbyyd24 / 364人阅读

摘要:编写完成后,将代码保存为,并在中执行此后创建函数。执行创建后,便可以在中执行查询暂不支持,因而需禁用其他如果包依赖了其他包,需要一并上传并同时加入到依赖中。

摘要: 新版 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/... ,仅有打勾的包可以直接使用:

下载 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/... 。
原文链接

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41748.html

相关文章

  • MaxCompute Studio使用心得系列6——一个工具完成整个Python UDF开发

    摘要:摘要北京云栖大会上阿里云发布了最新的功能,万众期待的功能终于支持啦,我怎么能不一试为快,今天就分享如何通过进行开发。注册函数在脚本中编辑试用好了,一个简单完整的通过开发实践分享完成。 摘要: 2017/12/20 北京云栖大会上阿里云MaxCompute发布了最新的功能Python UDF,万众期待的功能终于支持啦,我怎么能不一试为快,今天就分享如何通过Studio进行Python u...

    张迁 评论0 收藏0
  • 从单租户IaaS到多租户PaaS——金融级别大数据平台MaxCompute的多租户隔离实践

    摘要:摘要在年云栖大会北京峰会的大数据专场中,来自阿里云的高级技术专家李雪峰带来了主题为金融级别大数据平台的多租户隔离实践的演讲。三是运行隔离机制。针对这一问题,提供了多层隔离嵌套方案以便规避这种潜在的安全风险。 摘要:在2017年云栖大会•北京峰会的大数据专场中,来自阿里云的高级技术专家李雪峰带来了主题为《金融级别大数据平台的多租户隔离实践》的演讲。在分享中,李雪峰首先介绍了基于传统Iaa...

    beanlam 评论0 收藏0
  • PyODPS 使用 Python UDF

    摘要:中使用首先,我们需要写一个文件,假设我们就是把某一列按格式放的一列转成格式。这里我们指定了函数名叫,主类使我们上传的文件里的类。现在我们就可以在中调用这个了。这样我们就完成了在中使用的整个过程。 摘要: PyODPS 中使用 Python UDF 包含两方面,一个是直接使用,也就是在 MaxCompute SQL 中使用;一个是间接的方式,也就是 PyODPS DataFrame,这种...

    evin2016 评论0 收藏0

发表评论

0条评论

kbyyd24

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<