このトピックでは、Pythonで記述されたMaxComputeユーザー定義関数 (UDF) に関するよくある質問に対する回答を提供します。
クラスとリソース
次のクラスまたはリソースの問題が発生する可能性があります。
問題の説明1:MaxCompute UDFを呼び出すと、次のエラーメッセージが報告されます。
関数 'xxx' は解決できません.考えられる原因:
原因1: 使用するプロジェクトは、MaxCompute UDFが登録されているプロジェクトではありません。 たとえば、開発プロジェクトにMaxCompute UDFを登録し、本番プロジェクトでMaxCompute UDFを呼び出すと、エラーが報告されます。
原因2: MaxCompute UDFのクラスまたはリソースが無効です。
原因3: MaxCompute UDFが依存するリソースのタイプが無効です。 たとえば、PY型のPythonファイルをアップロードします。 ただし、MaxCompute UDFコードの
get_cache_fileには、FILEタイプのリソースが必要です。原因4: MaxCompute UDFが依存するリソースのデータが最新ではありません。 DataWorksを使用してリソースをMaxComputeにアップロードすると、遅延が発生する可能性があります。 この場合、MaxCompute UDFが依存するリソースのデータは最新ではありません。
原因5: Pythonバージョンはサポートされていません。 デフォルトでは、MaxComputeはPython 2を使用してジョブを実行します。 PythonコードにASCII以外の文字が存在する場合、コードを実行するとエラーが報告されます。
解決策:
解決策1: MaxComputeクライアントで、エラーが報告されたプロジェクトで
list functions;コマンドを実行します。 MaxCompute UDFがコマンド出力に含まれていない場合、プロジェクトはMaxCompute UDFが登録されているプロジェクトではありません。 MaxCompute UDFが登録されているプロジェクトに移動し、MaxCompute UDFを再度呼び出します。解決策2: MaxComputeクライアントで、
desc関数 <function_name>;コマンドを実行し、コマンド出力のClassとResourcesの値を確認します。ClassまたはResourcesパラメーターの値が無効な場合は、
create function <function_name> as <'package_to_class '> using <'resource_list'>;コマンドを実行して、UDFを再度登録します。 Pythonスクリプト名でpackage_to_classパラメーターを設定します。クラス名形式。 resource_listパラメーターを使用して、ファイル、テーブル、圧縮パッケージ、サードパーティパッケージなど、MaxComputeで参照するすべてのリソースを指定します。関数を登録する方法の詳細については、「UDFの作成」をご参照ください。
解決策3: MaxComputeクライアントで、
desc resource <resource_name>;コマンドを実行します。 コマンド出力のtypeパラメーターで指定されたリソースタイプが有効かどうかを確認します。 リソースタイプが無効な場合は、add <file_type> <file_name>;コマンドを実行してリソースを再度アップロードします。MaxCompute UDFコードで使用されているリソース参照メソッドが
get_cache_fileの場合、ファイルが参照され、リソースタイプはfileである必要があります。MaxCompute UDFコードで使用されているリソース参照方法が
get_cache_tableの場合、テーブルが参照され、リソースタイプはtableである必要があります。MaxCompute UDFコードで使用されているリソース参照メソッドが
get_cache_archiveの場合、圧縮されたパッケージが参照され、リソースタイプはARCHIVEである必要があります。
リソースのアップロード方法の詳細については、「リソースの追加」をご参照ください。
解決策4: MaxComputeクライアントで、
desc resource <resource_name>;コマンドを実行します。 コマンド出力のLastModifiedTimeパラメーターの値に基づいて、リソースデータが最新かどうかを確認します。 MaxCompute UDFで最新のリソースを使用する必要があります。解決策5:
#coding: utf-8または# -*- coding: utf-8 -*-をPythonコードヘッダーに追加して、エンコード形式を宣言します。 MaxCompute UDFの呼び出しに使用されるsql文の前にset odps. SQL. python.version=cp37;コマンドを追加し、SQL文と一緒にコマンドを送信することもできます。 このように、Python 3はジョブの実行に使用されます。
問題の説明2:でMaxCompute UDFを呼び出すと、
get_cache_archive ('xxx.zip ')が設定されている場合、次のいずれかのエラーが報告されます。IOError: ダウンロードリソース: xxx.zipに失敗しました,odps.distcache.DistributedCacheError、およびfuxi job failed: ダウンロードリソース失敗: xxx.zip.考えられる原因:
原因1: 圧縮パッケージが存在しません。 MaxCompute UDFを登録するときは、コマンドで圧縮パッケージを指定しません。
原因2: 圧縮パッケージのリソースタイプがARCHIVEではありません。
原因3: コード内のパッケージ名またはファイル名拡張子が実際のパッケージ名またはファイル名拡張子と一致していません。 たとえば、xxx.zipはコードで指定されていますが、アップロードされたファイルはxxx.tar.gzです。 この場合、パッケージはZIP形式で解凍されます。 その結果、解凍は失敗し、エラーが報告される。
原因4: 同じジョブにある2つのUDFは、同じ名前のリソースに依存しています。 ただし、リソースはさまざまなプロジェクトに存在します。
解決策:
解決策1: MaxComputeクライアントで、
desc function <function_name>;コマンドを実行します。 コマンド出力のResourcesパラメーターの値に、エラーメッセージに圧縮パッケージの名前が含まれているかどうかを確認します。圧縮パッケージの名前が存在しない場合は、
create function <function_name> as <'package_to_class '> using <'resource_list'>;コマンドを実行して、MaxCompute UDFを再度登録します。 コマンドのresources_listパラメーターに圧縮パッケージの名前を追加します。関数を登録する方法の詳細については、「UDFの作成」をご参照ください。
解決策2: MaxComputeクライアントで、
desc resource <resource_name>;コマンドを実行します。 コマンド出力のTypeパラメーターの値がARCHIVEかどうかを確認します。Typeパラメーターの値がARCHIVEでない場合は、
add archive <file_name>;コマンドを実行して、圧縮パッケージを再度アップロードします。リソースのアップロード方法の詳細については、「リソースの追加」をご参照ください。
解決策3: MaxComputeクライアントで、
desc function <function_name>;コマンドを実行します。 コマンド出力のResourcesパラメーターの値のパッケージ名とファイル名拡張子が、実際のパッケージ名とファイル名拡張子と一致しているかどうかを確認します。コマンド出力のパッケージ名またはファイル名拡張子が実際のパッケージ名またはファイル名拡張子と一致しない場合は、
add archive <file_name>;コマンドを実行して圧縮パッケージを再度アップロードします。 file_nameパラメーターを、実際のパッケージ名およびファイル名拡張子と一致する値に設定します。解決策4: ビューが依存するUDFを含め、ジョブが依存するすべてのUDFをトラブルシューティングします。 UDFが属するプロジェクトと、UDFに対応するリソースを確認します。 同じ名前のリソースが異なるプロジェクトに存在する場合は、ジョブが依存するUDFを変更するか、リソース名を変更することを推奨します。
問題の説明3: get_cache_table(table_name) が設定されているMaxCompute UDFを呼び出すと、次のエラーメッセージが報告されます。
odps.distcache.DistributedCacheError: テーブルリソース "xxx_table_name" not found.考えられる原因:
原因1: テーブルが存在しません。 MaxCompute UDFを登録するときは、コマンドでテーブルを指定しません。
原因2: テーブルのリソースタイプがtableではありません。
解決策:
解決策1: MaxComputeクライアントで、
desc function <function_name>;コマンドを実行します。 コマンド出力のResourcesパラメーターの値に、エラーメッセージのテーブル名が含まれているかどうかを確認します。テーブルの名前が存在しない場合は、
create function <function_name> as <'package_to_class '> using <'resource_list'>;コマンドを実行して、MaxCompute UDFを再度登録します。 コマンドのresource_listパラメーターにテーブルの名前を追加します。関数を登録する方法の詳細については、「UDFの作成」をご参照ください。
解決策2: MaxComputeクライアントで、
desc resource <resource_name>;コマンドを実行します。 コマンド出力のTypeパラメーターの値がTABLEかどうかを確認します。Typeパラメーターの値がTABLEでない場合は、
add table <table_name>;コマンドを実行して、テーブルを再度アップロードします。リソースのアップロード方法の詳細については、「リソースの追加」をご参照ください。
問題の説明4: サードパーティパッケージを参照するMaxCompute UDFを呼び出すと、次のエラーメッセージが報告されます。
ImportError: 'xxx' という名前のモジュールがありません。考えられる原因:
原因1: サードパーティパッケージのリソースタイプがARCHIVEではありません。
原因2: MaxCompute UDFを登録する際、コマンドでサードパーティパッケージを指定しません。
原因3: MaxCompute UDFコードでサードパーティパッケージのパスを指定していません。
原因4: サードパーティパッケージはWHEELファイルですが、ファイル名拡張子が無効です。 Pythonバージョンに基づいてWHEELファイルをダウンロードする必要があります。
原因5: サードパーティパッケージはWHEELファイルまたは純粋なPythonパッケージではありませんが、パッケージにはsetup.pyファイルが含まれています。
原因6: MaxCompute UDFのPythonファイルの名前が、MaxCompute UDFによって参照されるサードパーティモジュールの名前と競合します。 たとえば、MaxCompute UDFのPythonファイルがA.pyの場合、コード内の "import A" は、サードパーティパッケージ内のモジュールではなく、A.pyファイルをインポートします。
解決策:
解決策1: MaxComputeクライアントで、
desc resource <resource_name>;コマンドを実行します。 コマンド出力のTypeパラメーターの値がARCHIVEかどうかを確認します。Typeパラメーターの値がARCHIVEでない場合は、
add archive <file_name>;コマンドを実行して、圧縮パッケージを再度アップロードします。リソースのアップロード方法の詳細については、「リソースの追加」をご参照ください。
解決策2: MaxComputeクライアントで、
desc function <function_name>;コマンドを実行します。 コマンド出力のResourcesパラメーターの値に、エラーメッセージにサードパーティパッケージの名前が含まれているかどうかを確認します。サードパーティパッケージの名前が存在しない場合は、
create function <function_name> as <'package_to_class '> using <'resource_list'>;コマンドを実行して、MaxCompute UDFを再度登録します。 コマンドのresources_listパラメーターにサードパーティパッケージの名前を追加します。関数を登録する方法の詳細については、「UDFの作成」をご参照ください。
解決策3: サードパーティパッケージのパスが、MaxCompute UDFコードの
sys.path.insert(0, 'work/third-party package path')で設定されているかどうかを確認します。 たとえば、モジュール名はA、PythonファイルはA.pyです。 次の例は、コードで構成する必要があるパスを決定する方法を示しています。例1: Pythonファイルはresource_dirフォルダーにあり、このフォルダーはresource-of-A.zipパッケージに圧縮されます。
sys.path.insertで設定する必要があるパスは、work/resource-of-A.zip/resource_dir/です。例2: Pythonファイルはresource_dirフォルダーにあり、このフォルダー内のすべてのファイルはresource-of-A.zipパッケージに圧縮されます。
sys.path.insertで設定する必要があるパスは、work/resource-of-A.zip/です。例3: Pythonファイルはresource_dir/path1/path2フォルダーにあり、resource_dirフォルダー内のすべてのファイルはresource-of-A.zipパッケージに圧縮されます。
sys.path.insertで設定する必要があるパスは、work/resource-of-A.zip/path1/path2/です。
説明デフォルトでは、ARCHIVEタイプのリソースは相対パスに配置されます。
. /仕事 /MaxCompute UDFの実行パスの解決策4: WHEELファイルはPythonのバージョンによって異なります。 Python 2を使用する場合は、名前に
cp27-cp27m-manylinux1_x86_64が含まれるWHEELファイルをダウンロードする必要があります。 Python 3を使用する場合は、名前にcp37-cp37m-manylinux1_x86_64が含まれるWHEELファイルをダウンロードする必要があります。 ダウンロードしたWHEELファイルのファイル名拡張子を. zipに変更できます。 この方法では、WHEELファイルをZIPファイルにパッケージ化する必要はありません。解決策5: MaxComputeと互換性のあるPython環境で、setup.pyファイルをWHEELファイルにコンパイルします。 次に、リソースをアップロードし、MaxCompute UDFを登録します。 サードパーティパッケージをコンパイルする方法の詳細については、「コンパイルする必要があるサードパーティパッケージの参照」をご参照ください。
解決策6: MaxCompute UDFのPythonファイルの名前を変更します。
問題の説明5: 標準のPython 3ライブラリを参照するMaxCompute UDFを呼び出すと、次のエラーメッセージが報告されます。
ImportError: enumという名前のモジュールはありません。原因: MaxComputeプロジェクトでPython 3が有効になっていません。 デフォルトでは、Python 2はMaxCompute UDFの呼び出しに使用されます。 したがって、標準のPython 3ライブラリは識別できません。
解決策: MaxCompute UDFを呼び出すために使用されるsql文の前に、
set odps. SQL. python.version=cp37;コマンドを追加し、SQL文と一緒にコマンドを送信します。
問題の説明6: MaxCompute UDFを呼び出すと、次のエラーメッセージが報告されます。
ModuleNotFoundError: 'six' という名前のモジュールがありません。原因: サードパーティのパッケージをPython UDFと一緒に使用すると、パッケージのパスが
sys.pathに追加されません。 その結果、サードパーティパッケージはインポートできません。解決策:
include_package_path ('six.zip ')をsys.path.insert(0, 'work/six.zip')に変更します。 詳細については、「MaxCompute UDFでのScipyの実行」をご参照ください。
問題の説明7: MaxCompute UDFを呼び出すと、
xxx.pyからUdf情報を取得できませんでした。原因: ユーザー定義テーブル値関数 (UDTF) またはユーザー定義集計関数 (UDAF) のコードでは、基本クラスのインポートに使用されるステートメントが無効です。 たとえば、
import odps.udf.BaseUDTFまたはimport odps.udf.BaseUDAFを使用すると、エラーメッセージが表示されます。解決策: ステートメントを
from odps.udf import BaseUDTFまたはfrom odps.udf import BaseUDAFに変更します。
パフォーマンス
問題の説明: MaxCompute UDFを呼び出すと、次のエラーメッセージが報告されます:
kInstanceMonitorTimeout。原因: MaxCompute UDFのデータ処理がタイムアウトします。 デフォルトでは、UDFがデータを処理する期間は制限されています。 ほとんどの場合、UDFは1800秒以内に一度に1024行のデータを処理する必要があります。 この期間は、ワーカーが実行される合計期間ではなく、UDFが一度にデータレコードの小さなバッチを処理する期間です。 ほとんどの場合、MaxCompute SQLは1秒あたり10,000行以上のデータを処理できます。 この制限は、MaxCompute UDFの無限ループを防ぐことのみを目的としています。 無限ループが発生すると、CPUリソースが長時間占有されます。
解決策:
ロギングに関する情報をMaxCompute UDFコードに追加します。 これにより、ログを表示して、無限ループが発生しているかどうかを確認できます。 また、ログに記録された時間情報に基づいて、MaxCompute UDFによる単一のレコードの処理時間が期待値を満たしているかどうかを確認できます。 ログに関する次の情報をコードに追加します。 ジョブの実行後、Logview UIのStdOutでログを表示できます。
Python 2
sys.stdout.write('your log') sys.stdout.flush()Python 3
print('your log', flush=True)
データ量が多い場合、MaxCompute UDFは長期間実行される可能性があります。 タイムアウトエラーを防ぐために、次のパラメーターを調整できます。
パラメーター
説明
set odps.function.timeout=xxx;MaxCompute UDFのタイムアウト期間。 デフォルト値: 1800s。 このパラメーターは、ビジネス要件に基づいてより大きな値に設定できます。 有効な値: 1s ~ 3600s。
set odps.sql.exe cutionengine.batch.rowcount=xxx;MaxCompute UDFが一度に処理するデータ行の数。 デフォルト値: 1024。 このパラメーターは、ビジネス要件に基づいて小さい値に設定できます。
ネットワーク
問題の説明: MaxCompute UDFを呼び出してインターネットにアクセスすると、エラーが報告されます。
原因: MaxCompute UDFはインターネットへのアクセスをサポートしていません。
解決策: ビジネス要件に基づいて、ネットワーク接続申請フォームに記入して送信します。 MaxComputeテクニカルサポートチームは、ネットワーク接続を確立するために連絡します。 申請フォームへの記入方法の詳細については、「ネットワーク接続プロセス」をご参照ください。
サンドボックス
問題の説明: MaxCompute UDFを呼び出すと、次のエラーメッセージが報告されます。
RuntimeError: xxxはサンドボックスによってブロックされました。原因: 一部のPython UDFの呼び出しは、サンドボックスによってブロックされます。
解決策:
Python UDFの呼び出しに使用されるSQL文の前に、
set odps.isolation.session.enable=true;コマンドを追加し、SQL文と一緒にコマンドを送信します。デフォルトでは、Python 3 UDFの場合、
odps.isolation.session.enableはtrueに設定されます。
Encoding
次のエンコードの問題が発生する可能性があります。
問題の説明1: MaxCompute UDFを呼び出すと、次のエラーメッセージが表示されます。ファイルxxxの
SyntaxError: 非ASCII文字 '\xe8' 。 ラインyyy.原因: MaxCompute UDFのPythonファイルにはASCII以外の文字が含まれており、Python 2で実行されます。
解決策:
MaxCompute UDFの呼び出しに使用されるsql文の前に、
set odps. SQL. python.version=cp37;コマンドを追加し、SQL文と一緒にコマンドを送信します。 このように、Python 3はジョブの実行に使用されます。Pythonファイルの先頭に次の情報を追加します。 これにより、Python 2のデフォルトのエンコード形式がUTF-8に変更されます。
import sys reload(sys) sys.setdefaultencoding('utf-8')
問題の説明2: Python 2で記述されたMaxCompute UDFを呼び出すと、次のエラーメッセージが報告されます:
UnicodeEncodeError: 'ascii 'code can't encode in position x-y: ordinal not in range(128)。原因: 関数シグネチャで指定された戻り値の型はSTRINGです。 ただし、MaxCompute UDFはUNICODE型のPythonオブジェクトを返します。 たとえば、Pythonオブジェクトの名前がretの場合、MaxComputeは
str(ret)を使用して戻り値retをSTR型の値に変換します。 retがASCIIエンコード範囲内にある場合は、STR型に変換できます。 ただし、retがASCIIエンコード範囲内にない場合、変換は失敗し、エラーが報告されます。解決策: Pythonコードの
evaluateメソッドに次のステートメントを追加します。return ret.encode('utf-8')
問題の説明3: Python 3で記述されたMaxCompute UDFを呼び出すと、次のエラーメッセージが報告されます。
UnicodeDecodeError: 'utf-8' codec can't decode byte xxx in position xxx: invalid continuation byte。原因: 関数シグネチャで指定されている入力パラメーターの種類はSTRINGです。 ただし、Python 3 UDFを呼び出したときに入力された文字列は、UTF-8形式でSTR型のPythonオブジェクトにデコードできません。
解決策:
UTF-8以外の形式でエンコードされた文字列をMaxComputeテーブルに書き込まないでください。
Python 2 UDFは、STR型のGBKベースのPythonオブジェクトを返します。 Pythonオブジェクトは通常、MaxComputeテーブルに書き込むことができますが、Python 3 UDFでは読み取ることができません。 したがって、Python 2 UDFによって返される前に、PythonオブジェクトをUTF-8形式でエンコードすることをお勧めします。 たとえば、
ret.de code('gbk').encode('utf-8 ')を使用してPythonオブジェクトretをエンコードできます。SQL文で組み込み関数
is_encodingを使用して、UTF-8以外の形式でエンコードされたデータを除外します。 例:select py_udf(input_col) from example_table where is_encoding(input_col, 'utf-8', 'utf-8') = true;Pythonコードの関数シグネチャで指定されている入力パラメータータイプをBINARYに変更します。 次に、SQL文でSTRING型の列のデータ型をBINARY型に変換し、Python 3 UDFの入力パラメーターとして使用します。 例:
select py_udf(cast(input_col as binary)) from example_table;
関数署名
次の関数シグネチャの問題が発生する可能性があります。
問題の説明1: MaxCompute UDFを呼び出すと、次のエラーメッセージが報告されます。
UDTF/UDF/UDAF yyyyのクラスxxxのアノテーションに無効なコンテンツ '<EOF>' が含まれています。原因: MaxCompute UDFの入力パラメーターまたは出力パラメーターが複雑なデータ型であり、関数シグネチャの関連情報が無効です。
解決策: 関数シグネチャの複合データ型に関する情報を変更して、関数シグネチャが有効であることを確認します。 関数シグネチャの詳細については、「関数シグネチャとデータ型」をご参照ください。
問題の説明2: MaxCompute UDFを呼び出すと、次のエラーメッセージが報告されます。
TypeError: expected <class 'xxx'> but <class 'yyy'> found, value:zzz。原因: 関数シグネチャで指定された戻り値の型が、MaxCompute UDFによって返されるデータのデータ型と一致していません。
解決策: 想定されるデータ型を確認し、整合性を確保するために関数シグネチャまたはMaxCompute UDFコードを変更します。
問題の説明3: MaxCompute UDFを呼び出すと、次のエラーメッセージが報告されます。
セマンティック分析例外-ユーザー定義関数zzのクラスxxx.yyyの評価関数は注釈 ***->*** と一致しません。原因: 関数シグネチャで指定されている入力パラメーターの数が、MaxCompute UDFコードの関連メソッドの入力パラメーターの数と一致していません。
解決策: 入力パラメータの実際の数を確認し、整合性を確保するために関数シグネチャまたはMaxCompute UDFコードを変更します。
サードパーティパッケージ
問題の説明: MaxCompute UDFを呼び出すと、
GLIBCXX_x.x.xが見つかりません。原因: GLIBCXXのバージョン。ライブラリファイルは、MaxComputeでサポートされているバージョンよりも後に依存します。 glibcバージョンとCXXABIバージョンでも同じ問題が発生する可能性があります。
解決策: 互換性のあるホイールパッケージを使用するか、MaxComputeと互換性のある環境でライブラリファイルを作成します。 MaxComputeは、バイナリ実行可能ファイルまたは次の最新バージョンをサポートしています。ライブラリファイルが依存するので:
GLIBC <= 2.17 CXXABI <= 1.3.8 GLIBCXX <= 3.4.19 GCC <= 4.2.0
UDTF
問題の説明: MaxCompute UDTFを呼び出すと、次のエラーメッセージが報告されます。
セマンティック分析例外-2つのエイリアスを期待しますが、0があります。原因: Python UDTFコードで出力列名が指定されていません。
解決策:
AS句を使用して、Python UDTFを呼び出すために使用されるSELECTステートメントで列名を指定します。 例:select my_udtf(col0, col1) as (ret_col0, ret_col1, ret_col2) from tmp1;
UDAFs
問題の説明1: MaxCompute UDAFを呼び出すと、次のエラーメッセージが報告されます。
Script exception - ValueError: unmarshallable object。原因: Python UDAFコードの
bufferパラメーターの値がマーシャリング不可能なオブジェクトです。 詳細については、「Marshal」をご参照ください。解決策:
bufferに値を割り当てるときは、値がマーシャリング可能なオブジェクトであることを確認してください。 Python UDAFでLIST型とDICT型の2つのバッファーを使用する場合は、new_bufferメソッドでreturn [list(), dict()]を使用する必要があります。iterate、merge、またはterminateメソッドでbufferまたはpbufferを使用する場合、LISTタイプのbufferはbuffer[0] またはpbuffer[0]に対応し、DICTタイプのbufferはbuffer[1] またはpbuffer[1]に対応します。バッファの要素がLIST型またはDICT型である場合、要素もマーシャリング可能なオブジェクトでなければなりません。
問題の説明2: MaxCompute UDAFを呼び出すと、次のエラーメッセージが報告されます。
Python UDAFバッファサイズoverflowed: 2821486749。原因:
マーシャリング操作後、Python UDAFコードのbufferサイズが2 GBを超えました。bufferサイズが正しく処理されません。 その結果、データ量に応じてbufferサイズが大きくなる。解決策: Python UDAFコードのロジックを書き換えます。 このように、
bufferサイズは、データ量とともに増加しない。 たとえば、bufferがlistの場合、イテレーションおよびマージフェーズではbufferにデータを追加できません。 Python UDAFの詳細については、「概要」をご参照ください。