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

MaxCompute:UDF の例:Python UDF でサードパーティパッケージを使用する

最終更新日:Mar 27, 2026

MaxCompute は、Python ユーザー定義関数 (UDF) でのサードパーティパッケージをサポートしています。パッケージの種類によって、アップロードと登録のプロセスは異なります。このトピックでは、NumPy パッケージ (Python 3)、コンパイルが必要なパッケージ、ダイナミックリンクライブラリ (DLL) に依存するパッケージの 3 つのシナリオについて説明します。

前提条件

開始する前に、以下が準備できていることを確認してください:

  • Python がインストールされていること (Python 3 を推奨)

  • MaxCompute クライアントがインストールおよび設定されていること — 詳細については、「MaxCompute クライアントのインストールと設定」をご参照ください

  • パッケージのコンパイルが必要な場合は、pip、setuptools、wheel がインストールされていること:

    pip install setuptools
    pip install wheel
  • パッケージが GDAL 3.0 以降に依存する場合は、PROJ 6 がインストールされていること

  • Windows でコンパイルする場合は、Docker がインストールされていること — 詳細については、「Docker ドキュメント」をご参照ください

シナリオの選択

シナリオ 使用する状況
Python 3 UDF での NumPy パッケージの参照 Python 3 で NumPy が必要な場合。NumPy は Python 2 にプリインストールされているため、Python 2 ではアップロードは不要です。
コンパイルが必要なパッケージの参照 パッケージが PyPI の TAR.GZ ファイル、またはルートディレクトリに setup.py ファイルを含む GitHub のソースコードパッケージである場合。
DLL に依存するパッケージの参照 お客様のパッケージは、GDAL 3.0.4 などの DLL に依存しています。

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

このシナリオは、Python 3 を使用しており、NumPy ライブラリが必要な場合に使用します。NumPy は Python 2 にプリインストールされているため、Python 2 では手動でのアップロードは不要です。

  1. PyPI 上の NumPy ページ に移動し、[ダウンロード ファイル] セクションで、名前が cp37-cp37m-manylinux1_x86_64.whl で終わるパッケージをダウンロードします。この例では NumPy 1.19.2 を使用しています。他のサフィックスを持つパッケージは、ランタイムで失敗する可能性があります。別のバージョンを使用するには、[リリース履歴][ナビゲーション] セクションでクリックして、過去のリリースを参照してください。

    NumPy download page on PyPI

  2. ダウンロードしたファイルの名前を変更し、拡張子を .whl から .zip に変更します。例:numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip

  3. MaxCompute クライアントを使用して、.zip パッケージを MaxCompute プロジェクトにアップロードします。詳細については、「リソース操作」をご参照ください。

    ADD ARCHIVE D:\Downloads\numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip -f;
  4. Python UDF スクリプトを作成し、.py ファイルとして保存します。この例では、ファイルを import_numpy.py として保存します。

    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') # work/ の後のファイル名をパッケージ名に合わせて更新してください。
    
        def evaluate(self):
            import numpy
            return "import succeed"
  5. スクリプトをリソースとして MaxCompute プロジェクトにアップロードします。

    ADD PY D:\Desktop\import_numpy.py -f;
  6. アップロードしたスクリプトと NumPy パッケージを使用して UDF を作成します。詳細については、「関数操作」をご参照ください。この例では、UDF に numpy という名前を付けます。リソースリストに NumPy の .zip ファイルを含めます。

    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';
  7. SQL ステートメントで UDF を呼び出します。SQL を実行する前に Python 3 を有効にする必要があります。詳細については、「Python 3 UDF」をご参照ください。

コンパイルが必要なパッケージの参照

このシナリオは、パッケージが PyPI の TAR.GZ ファイル、またはルートディレクトリに setup.py ファイルを含む GitHub のソースコードパッケージである場合に使用します。MaxCompute と互換性のある環境で setup.py をコンパイルして WHL パッケージを生成し、それをアップロードして UDF を作成する必要があります。

サードパーティパッケージは Linux 環境で実行されます。互換性の問題を避けるため、Linux でコンパイルしてください。Windows を使用している場合は、Docker を使用します。

Linux でのコンパイル

コンパイルする前に、ご利用の環境が以下の要件を満たしていることを確認してください:

Python の互換性:次のコマンドを実行して ABI タグを確認します:

python -c "import wheel.pep425tags; print(wheel.pep425tags.get_abi_tag())"
  • cp27m または cp37m が返された場合、Python のバージョンは互換性があります。

  • cp27mu または cp37mu が返された場合は、./configure --enable-unicode=ucs2 を実行して、エンコード形式を UCS-2 に切り替えます。

GNU Compiler Collection (GCC) の互換性:GCC 4.9.2 以前を使用してください。それ以降のバージョンでは、MaxCompute と互換性のない .so ファイルが生成される可能性があります。

環境の準備ができたら、以下の手順を実行します:

  1. パッケージを解凍し、setup.py を含むディレクトリに移動します。例:GDAL-3.2.0.zip を解凍した後、setup.py ファイルは D:\Downloads\GDAL-3.2.0 にあります。

    Decompressed package directory structure

    cd D:\Downloads\GDAL-3.2.0
  2. bdist_wheel が利用可能かどうかを確認します:

    python setup.py --help-command
    • 出力に bdist_wheel が表示された場合は、次のステップに進みます。

    • bdist_wheel がリストにない場合は、setup.py を開き、from distutils.core import setupfrom setuptools import setup に変更してから進みます。

  3. setup.py をコンパイルして WHL パッケージを生成します:

    python setup.py bdist_wheel

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

WHL パッケージを生成した後、その拡張子を .whl から .zip に変更し、リソースとしてアップロードして UDF を作成します。「Python 3 UDF での NumPy パッケージの参照」と同じ手順に従ってください。

Docker を使用した Windows でのコンパイル

Windows では、quay.io/pypa/manylinux2010_x86_64 イメージから Docker コンテナ内でコンパイルします。必要なバージョンの Python バイナリは次の場所にあります:

  • Python 2:/opt/python/cp27-cp27m/bin/python

  • Python 3:/opt/python/cp37-cp37m/bin/python3

コンテナ内で python setup.py bdist_wheel を実行して WHL パッケージを生成し、その拡張子を .whl から .zip に変更し、「Python 3 UDF での NumPy パッケージの参照」のアップロードと UDF 作成の手順に従ってください。

DLL に依存するパッケージの参照

このシナリオは、パッケージが DLL に依存する場合に使用します。この例では、libgdalnumpy に依存する GDAL 3.0.4 を使用します。コンパイルは quay.io/pypa/manylinux2010_x86_64 イメージの Docker コンテナ内で行われます。進める前に Docker がインストールされていることを確認してください — 詳細については、「Docker ドキュメント」をご参照ください。

ステップ 1:依存関係の確認

PyPI の GDAL ページに移動し、[依存関係] セクションを確認します。

GDAL dependencies on PyPI

GDAL 3.0.4 は libgdalnumpy を必要とします。libgdal はソースからコンパイルし、numpy は別途取得します。

ステップ 2:NumPy パッケージの取得

以下のいずれかの方法を使用します:

  • PyPI の NumPy ページ に移動し、[ファイルをダウンロード] セクションで、cp37-cp37m-manylinux1_x86_64.whl で終わるパッケージをダウンロードします。Python 2 の場合は、[ナビゲーション] セクションで [リリース履歴] をクリックし、バージョン 1.16.6 以前を選択して、cp27-cp27m-manylinux1_x86_64.whl で終わるパッケージをダウンロードします。

  • コンテナ内で次のコマンドを実行して、NumPy を直接ダウンロードします:

    /opt/python/cp37-cp37m/bin/pip download numpy -d ./

ステップ 3:.so ライブラリファイルのコンパイル

  1. GDAL 3.0.4 のソースコードをダウンロードし、お使いのマシンに解凍します。

  2. Docker イメージをプルし、コンテナを起動します:

    docker pull quay.io/pypa/manylinux2010_x86_64
    docker run -it quay.io/pypa/manylinux1_x86_64 /bin/bash
  3. GDAL のソースコードをコンテナにコピーします。<CONTAINER ID> を実際のコンテナ ID に置き換えてください (取得方法については「docker ps」をご参照ください):

    docker cp ./gdal-3.0.4 <CONTAINER ID>:/opt/source/
  4. コンテナ内で GDAL のソースコードをコンパイルします。完全なビルド手順については、「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
    # ビルドを検証します。
    gdalinfo --version

    コンパイル中にエラーが発生した場合:

    • configure: error: PROJ 6 symbols not found — GDAL 3.0 以降をサポートするために PROJ 6 をインストールしてください。

    • fatal error: zlib.h: No such file or directoryyum install zlib-devel を実行してリトライしてください。

  5. コンテナから 2 つの .so ライブラリファイル (シンボリックリンクではない) をお使いのマシンにコピーします:

    • GDAL インストールディレクトリの lib フォルダにある libgdal.so

    • PROJ 6 インストールディレクトリの lib フォルダにある libproj.so

ステップ 4:GDAL WHL パッケージの生成

コンテナ内で次のコマンドを実行します。詳細なコンテキストについては、「BuildingOnUnix」をご参照ください。

# 必要に応じて NumPy をインストールします。
/opt/python/cp37-cp37m/bin/pip install numpy
# GDAL Python バインディングディレクトリに切り替えます。
cd swig/python
# WHL パッケージを生成します。出力:dist/GDAL-3.0.4-cp37-cp37m-linux_x86_64.whl
/opt/python/cp37-cp37m/bin/python setup.py bdist_wheel

ステップ 5:リソースのアップロードと UDF の作成

  1. WHL パッケージのファイル拡張子を .whl から .zip に変更します。

  2. リソースを MaxCompute プロジェクトにアップロードします:

    • libgdal.solibproj.soファイルリソースとしてアップロードします。

    • numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zipGDAL-3.0.4-cp37-cp37m-linux_x86_64.zipアーカイブリソースとしてアップロードします。

  3. UDF を作成し、4 つのファイルすべてをリソースリストに追加します:libgdal.solibproj.sonumpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip、および GDAL-3.0.4-cp37-cp37m-linux_x86_64.zip。アップロードと UDF 作成の手順については、「Python 3 UDF での NumPy パッケージの参照」をご参照ください。以下のサンプル Python 3 UDF コードは GDAL をインポートします:

    # 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') # work/ の後のファイル名をコンパイルした GDAL パッケージに合わせて更新してください。
            sys.path.insert(0, 'work/numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip') # work/ の後のファイル名を NumPy パッケージに合わせて更新してください。
    
        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 が見つからないというエラーが発生した場合は、include_file() の呼び出しでファイル名を、システム上の実際のバージョン付き .so ファイル名と一致するように更新してください (例:libgdal.solibgdal.so.26 に変更)。Python 2 の場合、get_cache_file パラメーターは異なります。「Python 2 で UDF を開発する」トピックの「リソースの参照」をご参照ください。

次のステップ