MaxCompute支持您在Python UDF中引用第三方包,例如Numpy包、需要编译的第三方包或依赖动态链接库的第三方包。本文为您介绍如何通过Python UDF引用第三方包。

背景信息

通过Python UDF使用第三方包支持的场景如下:
  • 使用Numpy包(Python 3 UDF)

    您需要修改Numpy包的后缀格式,基于MaxCompute客户端上传Numpy包,并注册函数。函数注册成功后即可通过Python 3 UDF调用。

  • 使用需要编译的第三方包

    您需要在与MaxCompute兼容的环境下,对第三方资源包中的setup.py脚本进行编译生成WHEEL包,并修改后缀格式。基于MaxCompute客户端上传包,并注册函数。函数注册成功后即可通过Python UDF调用。推荐使用Linux环境,Windows用户推荐使用Docker。

  • 使用依赖动态链接库的第三方包

    您需要基于第三方包的源码编译so链接库,然后编译生成WHEEL包,并修改后缀格式。基于MaxCompute客户端上传包和so链接库文件,并注册函数。函数注册成功后即可通过Python UDF调用。

前提条件

在执行操作前,请确认已完成如下操作:
  • 已安装Python环境。推荐使用Python 3。
  • 已安装并配置MaxCompute客户端。客户端配置详情请参见安装并配置MaxCompute客户端
  • 如果您通过Python UDF使用需要编译的第三方包,请确认已安装pip、setuptools(通过pip install setuptools安装)和wheel(通过pip install wheel安装)。
  • 如果您使用的第三方包为GDAL 3.0及以上版本,请确认已安装PROJ 6。
  • 如果您通过Docker编译第三方包,请确认已安装Docker,详情请参见Docker安装文档

使用Numpy包(Python 3 UDF)

您可以通过MaxCompute内置的Python 3环境使用Numpy包。MaxCompute内置的Python 2环境默认安装了Numpy,不需要手动上传Numpy包。通过Python 3 UDF使用Numpy包的步骤如下:

  1. 以1.19.2版本为例,在PyPI页面的Download files区域,单击文件名后缀为cp37-cp37m-manylinux1_x86_64.whl的Numpy包进行下载。
    下载numpy包
    说明 其它后缀名称的包可能会加载失败。如果您需要选择其他版本,在PyPI页面左上角的Navigation区域,单击Release history即可查看历史版本。
  2. 修改下载的Numpy包后缀为ZIP格式。
    例如numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip
  3. 通过MaxCompute客户端上传Numpy包至MaxCompute项目空间。上传资源详情请参见资源操作
    命令示例如下:
    ADD ARCHIVE D:\Downloads\numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip -f;
  4. 编写Python UDF脚本,保存为PY格式文件。
    假设此处保存的脚本名称为import_numpy.py。Python UDF脚本示例如下:
    from odps.udf import annotate
    
    @annotate("->string")
    class TryImport(object): #类名为TryImport。
        def __init__(self):
            import sys
            sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') #Numpy包,您只需要替换work/后边的包名即可。
    
        def evaluate(self):
            import numpy
            return "import succeed"
  5. 通过MaxCompute客户端将import_numpy.py脚本以资源形式上传至MaxCompute项目空间。
    命令示例如下:
    ADD PY D:\Desktop\import_numpy.py -f;
  6. 使用上传的import_numpy.py脚本及Numpy包,通过MaxCompute客户端注册自定义函数。注册函数详情请参见函数操作
    假设注册的自定义函数名为numpy。命令示例如下:
    CREATE FUNCTION numpy AS 'import_numpy.TryImport' USING 'doc_test_dev/resources/import_numpy.py,numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip';
    说明 注册函数时资源列表里需要加上Numpy包,例如numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip
  7. 完成注册后您即可编写SQL语句调用新建的自定义函数。执行SQL语句时需要开启 Python3,详情请参见Python 3 UDF

使用需要编译的第三方包

如果第三方包是PyPI页面中格式为TAR.GZ的压缩包,或从GitHub下载的源码包,这些包解压后的根目录下有时会存在setup.py文件。在使用这种类型的第三方包前,您需要先在与MaxCompute兼容的环境下将setup.py编译生成WHEEL包,然后再执行