日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

UDF示例:Python UDF使用第三方包

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,函數資源所在項目為test_project。命令示例如下:

    CREATE FUNCTION numpy AS 'import_numpy.TryImport' USING 'test_project/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,詳情請參見UDF開發規范與通用流程(Python3)

使用需要編譯的第三方包

如果第三方包是PyPI頁面中格式為TAR.GZ的壓縮包,或從GitHub下載的源碼包,這些包解壓后的根目錄下有時會存在setup.py文件。在使用這種類型的第三方包前,您需要先在與MaxCompute兼容的環境下將setup.py編譯生成WHEEL包,然后再執行上傳資源及注冊函數操作,即可通過Python UDF調用第三方包。上傳資源及注冊函數操作請參見使用Numpy包(Python 3 UDF)

重要
  • 由于第三方包是運行在Linux環境的,推薦您使用Linux環境編譯第三方包,使用Windows環境編譯會存在包不兼容的問題。

  • 如果您使用Windows環境,推薦在Docker的quay.io/pypa/manylinux2010_x86_64鏡像容器中使用對應版本的Python(/opt/python/cp27-cp27m/bin/python/opt/python/cp37-cp37m/bin/python3)編譯生成WHEEL包。

以Linux環境為例,確保環境兼容的關注點如下:

  • 需要使用兼容的Python版本。在系統的命令行窗口執行如下命令,檢查環境Python版本。

    python -c "import wheel.pep425tags; print(wheel.pep425tags.get_abi_tag())"
    • 如果返回值為cp27mcp37m,表示Python版本滿足兼容性。

    • 如果返回值為cp27mucp37mu,表示Python版本不滿足兼容性。您需要在系統的命令行窗口執行./configure --enable-unicode=ucs2命令配置Python編碼格式為UCS2。

  • 如果涉及C或C++代碼依賴,需要使用兼容的GCC(GNU Compiler Collection)版本。

    說明

    推薦您使用GCC 4.9.2及以下版本,GCC版本高于4.9.2時,編譯生成的WHEEL包中的SO類型文件可能與MaxCompute環境不兼容。

確認環境滿足兼容性要求后,以Linux系統為例,通過setup.py生成WHEEL包的步驟如下:

  1. 將第三方包解壓到本地,在系統的命令行窗口,切換路徑至setup.py文件所在文件夾。

    例如,下載的包為GDAL-3.2.0.zip,解壓后setup.py文件所在路徑為D:\Downloads\GDAL-3.2.0,命令示例如下:

    cd D:\Downloads\GDAL-3.2.0

    解壓路徑

  2. 在系統的命令行窗口,執行如下命令查看返回結果中是否有bdist_wheel。

    命令示例如下:

    python setup.py --help-command
    • 如果返回結果中有bdist_wheel,請執行步驟3

    • 如果返回結果中沒有bdist_wheel,您需要修改setup.py腳本,將腳本中的from distutils.core import setup修改為from setuptools import setup,然后再執行步驟3

  3. 在系統的命令行窗口,執行如下命令編譯生成WHEEL包。

    python setup.py bdist_wheel 
    說明

    WHEEL包在dist目錄下。

使用依賴動態鏈接庫的第三方包

部分Python第三方包除了依賴Python庫,可能還會依賴其它動態鏈接庫的依賴。以GDAL 3.0.4為例,為您介紹如何使用Docker的quay.io/pypa/manylinux2010_x86_64鏡像容器,編譯相關的so鏈接庫,并編譯生成可以在MaxCompute上使用的WHEEL包。基于生成的so鏈接庫文件、WHEEL包或Numpy包,再執行上傳資源及注冊函數操作,即可通過Python UDF調用第三方包。上傳資源及注冊函數操作請參見使用Numpy包(Python 3 UDF)

說明

請確認您已安裝Docker后再執行后續步驟。Docker操作詳情請參見Docker文檔

通過Python UDF使用依賴so鏈接庫的第三方包的操作步驟如下:

  1. 查看依賴項。您可以在PyPI頁面的Dependencies區域查看依賴項。

    例如GDAL 3.0.4的依賴項如下。查看依賴項

    說明

    在圖示中,依賴項包括libgdalnumpylibgdal需要在鏡像容器中通過編譯GDAL源碼得到,numpy需要在PyPI頁面或通過Docker鏡像容器下載NumPy包。

  2. 下載Numpy包。

    您可以選擇如下兩種方式之一下載Numpy包:

    • PyPI頁面的Download files區域,單擊文件名后綴為cp37-cp37m-manylinux1_x86_64.whl的NumPy包進行下載。

      說明

      需要注意的是,如果您的Python環境為Python 2,Numpy包需要在PyPI頁面左側的Navigation區域,單擊Release history,選擇1.16.6及之前版本,且后綴為cp27-cp27m-manylinux1_x86_64.whl的包進行下載。

    • 在Docker的quay.io/pypa/manylinux2010_x86_64鏡像容器中,執行/opt/python/cp37-cp37m/bin/pip download numpy -d ./命令下載NumPy包到當前目錄。

  3. 編譯so鏈接庫。

    1. 下載GDAL 3.0.4源碼并解壓到本地。

    2. 使用Docker下載quay.io/pypa/manylinux2010_x86_64鏡像容器,進入終端輸入模式。

      命令示例如下:

      docker pull quay.io/pypa/manylinux2010_x86_64
      docker run -it quay.io/pypa/manylinux1_x86_64 /bin/bash
    3. 上傳GDAL 3.0.4源碼到鏡像容器中。

      命令示例如下:

      docker cp ./gdal-3.0.4 <CONTAINER ID>:/opt/source/  

      CONTAINER ID獲取方式請參見docker ps

  4. 在鏡像容器中編譯GDAL 3.0.4,操作詳情請參見BuildingOnUnix

    命令示例如下:

    # configure選項中需要指定安裝PROJ 6的位置。
    ./configure --prefix=/path/to/install/prefix --with-proj=/path/to/install/proj6/prefix
    make
    make install
    export PATH=/path/to/install/prefix/bin:$PATH
    export LD_LIBRARY_PATH=/path/to/install/prefix/lib:$LD_LIBRARY_PATH
    export GDAL_DATA=/path/to/install/prefix/share/gdal
    # Test
    gdalinfo --version

    編譯過程中可能出現如下報錯:

    • configure: error: PROJ 6 symbols not found:GDAL 3.0及以上版本依賴PROJ 6,需要您下載安裝PROJ 6。

    • fatal error: zlib.h: No such file or directory:改用yum install zlib-devel命令編譯。

  5. 使用Docker下載命令將兩個so鏈接庫(非軟鏈接)下載到本機,在GDAL、PROJ 6安裝目錄的lib文件夾下獲取libgdal.solibproj.so

  6. 在鏡像容器中制作GDAL WHEEL包。操作詳情請參見BuildingOnUnix

    命令示例如下:

    # 如果需要numpy支持,要先安裝numpy。
    /opt/python/cp37-cp37m/bin/pip install numpy
    # 切換到GDAL源碼目錄下。
    cd swig/python
    # 生成WHEEL包,在dist目錄下。WHEEL包示例:GDAL-3.0.4-cp37-cp37m-linux_x86_64.whl
    /opt/python/cp37-cp37m/bin/python setup.py bdist_wheel
  7. 基于生成的so鏈接庫文件、WHEEL包或Numpy包,再執行上傳資源及注冊函數操作,即可實現通過Python UDF使用第三方包。上傳資源及注冊函數操作請參見使用Numpy包(Python 3 UDF)

    需要注意的是:

    • 在上傳資源時,您需要以FILE資源形式上傳libgdal.solibproj.so,以ARCHIVE資源形式上傳numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zipGDAL-3.0.4-cp37-cp37m-linux_x86_64.zip

    • 在注冊函數時,您需要在函數資源列表中添加libgdal.solibproj.sonumpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zipGDAL-3.0.4-cp37-cp37m-linux_x86_64.zip

    Python UDF代碼示例如下:

    說明

    本示例為Python 3代碼,請在Python 3環境中執行。如果您需要在Python 2環境執行,請注意get_cache_file參數的使用方法,詳情可參見引用資源

    # coding: utf-8
    from odps.udf import annotate
    from odps.distcache import get_cache_file
    
    def include_file(file_name):
        import os, sys
        so_file = get_cache_file(file_name, 'b')
        
        with open(so_file.name, 'rb') as fp:
            content=fp.read()
            so = open(file_name, "wb")
            so.write(content)
            so.flush()
            so.close()
    
    @annotate("->string")
    class TryImport(object):
        def __init__(self):
            import sys
            include_file('libgdal.so.26')
            include_file('libproj.so.15')
            sys.path.insert(0, 'work/GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip') #編譯后的GDAL包,您只需要替換work/后邊的包名即可。
            sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') #Numpy包,您只需要替換work/后邊的包名即可。
    
        def evaluate(self):
            from osgeo import gdal
            from osgeo import ogr
            from osgeo import osr
            from osgeo import gdal_array
            from osgeo import gdalconst
            return "import succeed"
    說明

    運行時如果報錯找不到libgdal.so.26libproj.so.15,您需要修改libgdal.solibproj.solibgdal.so.26libproj.so.15