MaxComputeでは、Pythonのユーザー定義関数 (UDF) でサードパーティのパッケージを参照できます。 パッケージには、NumPyパッケージ、コンパイルが必要なサードパーティパッケージ、およびダイナミックリンクライブラリ (DLL) に依存するサードパーティパッケージを使用できます。 このトピックでは、Python UDFでサードパーティパッケージを参照する方法について説明します。
背景情報
次のシナリオでは、Python UDFでサードパーティのパッケージを参照できます。
NumPyパッケージの名前拡張子を変更し、MaxComputeクライアントを使用してNumPyパッケージをアップロードし、UDFを作成する必要があります。 UDFを作成した後、Python 3 UDFを呼び出すことができます。
setup.pyスクリプトをサードパーティパッケージでコンパイルし、wheelパッケージを生成してから、MaxComputeと互換性のある環境でwheelパッケージの名前拡張子を変更する必要があります。 次に、MaxComputeクライアントを使用してホイールパッケージをアップロードし、UDFを作成します。 UDFを作成した後、Python UDFを呼び出すことができます。 Linuxオペレーティングシステムの使用を推奨します。 Windowsオペレーティングシステムを使用する場合は、Dockerを使用することを推奨します。
をコンパイルする必要があります。サードパーティパッケージのソースコードに基づいてライブラリファイルを作成し、ホイールパッケージの名前拡張子を変更します。 次に、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パッケージを参照するには、次の手順を実行します。
PyPIページの [ファイルのダウンロード] セクションで、名前がcp37-cp37m-manylinux1_x86_64.whlで終わるパッケージをクリックしてパッケージをダウンロードします。 この例では、NumPy 1.19.2が使用されます。
説明名前が他の文字で終わるパッケージをダウンロードすると、操作が失敗することがあります。 NumPyパッケージの別のバージョンを選択する必要がある場合は、PyPIページの左上隅にある [ナビゲーション] セクションの [リリース履歴] をクリックして、過去のバージョンを表示します。
ダウンロードしたNumPyパッケージの拡張子を. zipに変更します。
例: numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip
MaxComputeクライアントを使用して、NumPyパッケージをMaxComputeプロジェクトにアップロードします。 パッケージをアップロードする方法の詳細については、「リソース操作」をご参照ください。
サンプルコマンド:
ADD ARCHIVE D:\Downloads\numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip -f;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"MaxComputeクライアントを使用して、import_numpy.pyスクリプトをリソースとしてMaxComputeプロジェクトにアップロードします。
サンプルコマンド:
ADD PY D:\Desktop\import_numpy.py -f;アップロードされた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パッケージをリソースリストに追加する必要があります。
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オペレーティングシステムでホイールパッケージを生成します。
サードパーティのパッケージをオンプレミスマシンに解凍し、CLIで必要なコマンドを実行して、setup.pyファイルが保存されているパスに移動します。
たとえば、GDAL-3.2.0.zipパッケージがダウンロードされます。 パッケージを解凍すると、setup.pyファイルはD:\Downloads\GDAL-3.2.0に保存されます。 サンプルコマンド:
cd D:\Downloads\GDAL-3.2.0
CLIで次のコマンドを実行して、bdist_wheelが返されるかどうかを確認します。
サンプルコマンド:
python setup.py --help-commandCLIで次のコマンドを実行して、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に依存するサードパーティのパッケージを参照するには、次の手順を実行します。
PyPIページにDependenciesセクションのdependenciesを表示します。
次の図は、GDAL 3.0.4の依存関係を示しています。
説明上の図では、依存関係にlibgdalとnumpyがあります。 libgdalを取得するには、DockerコンテナでGDALソースコードをコンパイルします。 numpyを取得するには、PyPIページまたはDockerコンテナからNumPyパッケージをダウンロードします。
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パッケージを現在のディレクトリにダウンロードします。
.so library fileをコンパイルします。
ダウンロードします。GDAL 3.0.4ソースコードファイルを作成し、オンプレミスマシンにファイルを解凍します。
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/bashGDAL 3.0.4ソースコードをDockerコンテナにアップロードします。
サンプルコマンド:
docker cp ./gdal-3.0.4 <CONTAINER ID>:/opt/source/CONTAINER IDの取得方法の詳細については、「docker ps」をご参照ください。
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コマンドを使用してコードをコンパイルします。
Dockerダウンロードコマンドを実行して2つをダウンロードします。ライブラリファイル (シンボリックリンクではない) をオンプレミスマシンに GDALのインストールディレクトリのlibフォルダからlibgdal.soを、PROJ 6のインストールディレクトリのlibフォルダからlibproj.soを取得します。
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生成されたをアップロードします。ライブラリファイル、ホイールパッケージ、またはNumPyパッケージをリソースとして作成し、UDFを作成します。 UDFの作成後、Python UDFでサードパーティのパッケージを呼び出すことができます。 リソースをアップロードしてUDFを作成する方法の詳細については、「Python 3 UDFのNumPyパッケージの参照」をご参照ください。
リソースをアップロードしてUDFを作成するときは、次の項目に注意してください。
リソースをアップロードするときは、ファイルリソースとしてlibgdal.soとlibproj.soを、アーカイブリソースとしてnumpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zipとGDAL-3.0.4-cp37-cp37m-linux_x86_64.zipをアップロードする必要があります。
関数を作成するときは、関数のリソースリストにlibgdal.so、libproj.so、numpy-1.19.2-cp37-cp37m-manylinux1_x86_64.zip、GDAL-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.soをlibgdal.so.26またはlibproj.soをlibproj.so.15に変更する必要があります。