すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:例: Python UDFでのサードパーティパッケージの参照

最終更新日:Jan 06, 2025

MaxComputeでは、Pythonのユーザー定義関数 (UDF) でサードパーティのパッケージを参照できます。 パッケージには、NumPyパッケージ、コンパイルが必要なサードパーティパッケージ、およびダイナミックリンクライブラリ (DLL) に依存するサードパーティパッケージを使用できます。 このトピックでは、Python UDFでサードパーティパッケージを参照する方法について説明します。

背景情報

次のシナリオでは、Python UDFでサードパーティのパッケージを参照できます。

  • Python 3 UDFでNumPyパッケージを参照

    NumPyパッケージの名前拡張子を変更し、MaxComputeクライアントを使用してNumPyパッケージをアップロードし、UDFを作成する必要があります。 UDFを作成した後、Python 3 UDFを呼び出すことができます。

  • 参照サードパーティパッケージをコンパイルする必要があります

    setup.pyスクリプトをサードパーティパッケージでコンパイルし、wheelパッケージを生成してから、MaxComputeと互換性のある環境でwheelパッケージの名前拡張子を変更する必要があります。 次に、MaxComputeクライアントを使用してホイールパッケージをアップロードし、UDFを作成します。 UDFを作成した後、Python UDFを呼び出すことができます。 Linuxオペレーティングシステムの使用を推奨します。 Windowsオペレーティングシステムを使用する場合は、Dockerを使用することを推奨します。

  • DLLに依存するサードパーティパッケージの参照

    をコンパイルする必要があります。サードパーティパッケージのソースコードに基づいてライブラリファイルを作成し、ホイールパッケージの名前拡張子を変更します。 次に、MaxComputeクライアントを使用して、ホイールパッケージと ライブラリファイルを作成し、UDFを作成します。 UDFを作成した後、Python UDFを呼び出すことができます。

前提条件

次の要件が満たされていることを確認してください。

  • Pythonがインストールされています。 Python 3をインストールすることを推奨します。

  • MaxComputeクライアントがインストールされ、設定されています。 詳細については、「MaxComputeクライアントのインストールと設定」をご参照ください。

  • Python UDFを使用して、コンパイルが必要なサードパーティ製パッケージを参照する場合は、pip、setuptools、およびwheelがインストールされます。 pip install setuptoolsコマンドを実行してsetuptoolsをインストールし、pip install wheelコマンドを実行してwheelをインストールします。

  • PROJ 6は、GDAL 3.0以降のサードパーティパッケージを使用する場合にインストールされます。

  • Dockerを使用してサードパーティパッケージをコンパイルする場合、Dockerがインストールされます。 詳細については、「Dockerドキュメント」をご参照ください。

Python 3 UDFでNumPyパッケージを参照する

MaxComputeでPython 3を使用してNumPyパッケージを参照できます。 デフォルトでは、NumPyライブラリはMaxComputeのPython 2にインストールされます。 Python 2でNumPyパッケージを手動でアップロードする必要はありません。 Python 3 UDFでNumPyパッケージを参照するには、次の手順を実行します。

  1. PyPIページの [ファイルのダウンロード] セクションで、名前がcp37-cp37m-manylinux1_x86_64.whlで終わるパッケージをクリックしてパッケージをダウンロードします。 この例では、NumPy 1.19.2が使用されます。

    下载numpy包

    説明

    名前が他の文字で終わるパッケージをダウンロードすると、操作が失敗することがあります。 NumPyパッケージの別のバージョンを選択する必要がある場合は、PyPIページの左上隅にある [ナビゲーション] セクションの [リリース履歴] をクリックして、過去のバージョンを表示します。

  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): # The class name is TryImport. 
        def __init__(self):
            import sys
            sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # The NumPy package. You need only to change the package name after 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クライアントにUDFを作成します。 UDFの作成方法の詳細については、「関数操作」をご参照ください。

    この例では、作成されたUDFは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';
    説明

    UDFを作成するときは、numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zipなどのNumPyパッケージをリソースリストに追加する必要があります。

  7. UDFを作成した後、SQL文でUDFを呼び出すことができます。 Python 3がSQL文を実行できるようにする必要があります。 詳細については、「Python 3 UDF」をご参照ください。

コンパイルが必要なサードパーティパッケージを参照

サードパーティパッケージが、PyPIからダウンロードされたTAR.GZパッケージ、またはGitHubからダウンロードされたソースコードパッケージである場合、setup.pyファイルは、解凍されたサードパーティパッケージのルートディレクトリに格納されている可能性があります。 このタイプのサードパーティパッケージを使用するには、セットアップ. pyファイルをコンパイルし、MaxComputeと互換性のある環境でホイールパッケージを生成する必要があります。 次に、パッケージをリソースとしてアップロードし、UDFを作成します。 UDFの作成後、Python UDFでサードパーティのパッケージを呼び出すことができます。 リソースをアップロードしてUDFを作成する方法の詳細については、「Python 3 UDFのNumPyパッケージの参照」をご参照ください。

重要
  • サードパーティのパッケージは、Linuxオペレーティングシステムで実行されます。 Linuxオペレーティングシステムでサードパーティのパッケージをコンパイルすることを推奨します。 Windowsオペレーティングシステムでサードパーティのパッケージをコンパイルすると、非互換性の問題が発生する可能性があります。

  • Windowsオペレーティングシステムを使用する場合は、必要なバージョンのPythonを使用してsetup.pyファイルをコンパイルし、quay.io/pypa/manylinux2010_x86_64イメージから作成されたDockerコンテナにホイールパッケージを生成することを推奨します。 必要なバージョンのPythonは、/opt/python/cp27-cp27m/bin/pythonまたは /opt/python/cp37-cp37m/bin/python3に格納されます。

Linuxオペレーティングシステムを使用している場合は、次の要件が満たされていることを確認してください。

  • MaxComputeと互換性のあるPythonバージョンが使用されます。 システムのコマンドラインインターフェイス (CLI) で次のコマンドを実行して、Pythonのバージョンを確認できます。

    python -c "import wheel.pep425tags; print(wheel.pep425tags.get_abi_tag())"
    • cp27mまたはcp37mが返された場合、Pythonバージョンは互換性要件を満たしています。

    • cp27muまたはcp37muが返された場合、Pythonバージョンは互換性要件を満たしていません。 この場合は、. /configure -- enable-unicode=ucs2コマンドを実行して、Pythonエンコード形式をUCS-2に変更します。

  • CまたはC ++ のコードが必要な場合、Linuxオペレーティングシステムは、使用中のGNUコンパイラコレクション (GCC) バージョンと互換性がある必要があります。

    説明

    GCC 4.9.2以前の使用を推奨します。 GCCバージョンが4.9.2以降の場合、生成されたホイールパッケージのファイルはMaxComputeと互換性がない可能性があります。

すべての要件が満たされている場合は、次の手順を実行してsetup.pyファイルをコンパイルし、Linuxオペレーティングシステムでホイールパッケージを生成します。

  1. サードパーティのパッケージをオンプレミスマシンに解凍し、CLIで必要なコマンドを実行して、setup.pyファイルが保存されているパスに移動します。

    たとえば、GDAL-3.2.0.zipパッケージがダウンロードされます。 パッケージを解凍すると、setup.pyファイルはD:\Downloads\GDAL-3.2.0に保存されます。 サンプルコマンド:

    cd D:\Downloads\GDAL-3.2.0

    解压路径

  2. CLIで次のコマンドを実行して、bdist_wheelが返されるかどうかを確認します。

    サンプルコマンド:

    python setup.py --help-command
    • bdist_wheelが返された場合は、ステップ3に進みます。

    • bdist_wheelが返されない場合は、setup.pyファイルでfrom distutils.core import setupfrom setuptools import setupに変更します。 次に、ステップ3に進みます。

  3. CLIで次のコマンドを実行して、setup.pyファイルをコンパイルし、ホイールパッケージを生成します。

    python setup.py bdist_wheel 
    説明

    ホイールパッケージはdistフォルダに保存されます。

DLLに依存するサードパーティパッケージを参照する

Pythonの一部のサードパーティパッケージは、Pythonライブラリと他のDLLに依存しています。 このセクションでは、Dockerコンテナーを使用して ライブラリファイルを作成し、MaxComputeで使用できるホイールパッケージを生成します。 コンテナは、quay.io/pypa/manylinux2010_x86_64イメージから作成されます。 この例ではGDAL3.0.4を使用する。 生成されたをアップロードする必要があります。ライブラリファイルとwheelパッケージまたはNumPyパッケージをリソースとして作成し、UDFを作成します。 UDFの作成後、Python UDFでサードパーティのパッケージを呼び出すことができます。 リソースをアップロードしてUDFを作成する方法の詳細については、「Python 3 UDFのNumPyパッケージの参照」をご参照ください。

説明

Python UDFのDLLに依存するサードパーティのパッケージを参照する前に、Dockerがインストールされていることを確認する必要があります。 詳細については、「Dockerドキュメント」をご参照ください。

Python UDFのDLLに依存するサードパーティのパッケージを参照するには、次の手順を実行します。

  1. PyPIページにDependenciesセクションのdependenciesを表示します。

    次の図は、GDAL 3.0.4の依存関係を示しています。查看依赖项

    説明

    上の図では、依存関係にlibgdalnumpyがあります。 libgdalを取得するには、DockerコンテナでGDALソースコードをコンパイルします。 numpyを取得するには、PyPIページまたはDockerコンテナからNumPyパッケージをダウンロードします。

  2. NumPyパッケージを取得します。

    次のいずれかの方法を使用して、NumPyパッケージを取得できます。

    • PyPIページの [ファイルのダウンロード] セクションで、名前がcp37-cp37m-manylinux1_x86_64.whlで終わるパッケージをクリックしてパッケージをダウンロードします。

      説明

      Python 2を使用する場合は、次の操作を実行してNumPyパッケージをダウンロードします。PyPIページの [ナビゲーション] セクションで、[リリース履歴] をクリックし、1.16.6以前のバージョンを選択し、名前がcp27-cp27m-manylinux1_x86_64.whlで終わるパッケージをクリックします。

    • quay.io/pypa/manylinux2010_x86_64イメージから作成されたコンテナで /opt/python/cp37-cp37m/bin/pip download numpy -d ./ コマンドを実行して、NumPyパッケージを現在のディレクトリにダウンロードします。

  3. .so library fileをコンパイルします。

    1. ダウンロードします。GDAL 3.0.4ソースコードファイルを作成し、オンプレミスマシンにファイルを解凍します。

    2. quay.io/pypa/manylinux2010_x86_64イメージから作成されたDockerコンテナをダウンロードし、Dockerクライアントの入力モードに入ります。

      サンプルコマンド:

      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コンテナにアップロードします。

      サンプルコマンド:

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

      CONTAINER IDの取得方法の詳細については、「docker ps」をご参照ください。

  4. GDAL 3.0.4ソースコードをコンテナにコンパイルします。 詳細については、「BuildingOnUnix」をご参照ください。

    サンプルコマンド:

    # Specify the directory to install PROJ 6 in the configure field. 
    ./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: このエラーが発生した場合は、PROJ 6をインストールしてGDAL 3.0以降をサポートします。

    • fatal error: zlib.h: このようなファイルまたはディレクトリがありません: このエラーが発生した場合は、yum install zlib-develコマンドを使用してコードをコンパイルします。

  5. Dockerダウンロードコマンドを実行して2つをダウンロードします。ライブラリファイル (シンボリックリンクではない) をオンプレミスマシンに GDALのインストールディレクトリのlibフォルダからlibgdal.soを、PROJ 6のインストールディレクトリのlibフォルダからlibproj.soを取得します。

  6. DockerコンテナでGDALホイールパッケージを生成します。 詳細については、「BuildingOnUnix」をご参照ください。

    サンプルコマンド:

    # If NumPy is required, install NumPy first. 
    /opt/python/cp37-cp37m/bin/pip install numpy
    # Switch to the directory in which GDAL source code is saved. 
    cd swig/python
    # Generate a wheel package and save it in the dist folder. Example: GDAL-3.0.4-cp37-cp37m-linux_x86_64.whl
    /opt/python/cp37-cp37m/bin/python setup.py bdist_wheel
  7. 生成されたをアップロードします。ライブラリファイル、ホイールパッケージ、またはNumPyパッケージをリソースとして作成し、UDFを作成します。 UDFの作成後、Python UDFでサードパーティのパッケージを呼び出すことができます。 リソースをアップロードしてUDFを作成する方法の詳細については、「Python 3 UDFのNumPyパッケージの参照」をご参照ください。

    リソースをアップロードしてUDFを作成するときは、次の項目に注意してください。

    • リソースをアップロードするときは、ファイルリソースとしてlibgdal.solibproj.soを、アーカイブリソースとして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 2でコードを実行する場合は、get_cache_fileパラメーターに注意してください。 詳細については、「Python 2でUDFを開発する」トピックの参照リソースを参照してください。

    # 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') # The GDAL package after compilation. You need only to change the package name that follows work/. 
            sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # The NumPy package. You need only to change the package name after 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.26またはlibproj.so.15が見つからないエラーが発生した場合は、libgdal.solibgdal.so.26またはlibproj.solibproj.so.15に変更する必要があります。