UDF 説明
ユーザーはUDF関数を作成し、JARファイルにパッケージ化した後、データレイク計算で関数として定義し、クエリ分析で使用できます。現在、データレイク計算DLCのUDFはHIVE形式で、org.apache.hadoop.hive.ql.exec.UDFを継承し、evaluateメソッドを実装しています。
例:シンプルな配列UDF関数。
public class MyDiff extends UDF {
public ArrayList<Integer> evaluate(ArrayList<Integer> input) {
ArrayList<Integer> result = new ArrayList<Integer>();
result.add(0, 0);
for (int i = 1; i < input.size(); i++) {
result.add(i, input.get(i) - input.get(i - 1));
}
return result;
}
}
pomファイルの参照:
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.16</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1</version>
</dependency>
</dependencies>
UDF Jarパッケージのベストプラクティス
UDFのJarパッケージは、関数の登録または使用時にのみエンジンにロードされます。UDFを使用する際には、以下の特性に注意することをお勧めします:
1. Jarパッケージのホットアップデート
SparkはデフォルトでJarパッケージのホットアップデートをサポートしていません。DLCではspark.jars.update.enabled=true(エンジン静的レベルパラメータ、エンジンの再起動が必要、標準エンジン20250630以降のバージョンでサポート)を設定することで有効にできますが、本番環境では誤ってCOS上のJarパッケージを更新して本番環境に影響を与える可能性があるため、有効にすることを推奨しません。
2. Jarパッケージのバージョンと同名クラス。
JavaのClassLoaderはすでにロードされたJarパッケージからクラス情報を優先的に検索するため、複数のバージョンや異なる名前のJarパッケージに同じ名前のクラスが含まれているシナリオを避ける必要があります。そうしないと、JVMが古いクラスをロードして計算結果が誤る可能性があります。
3. Jarパッケージのセキュリティチェック。
DLC の Spark エンジンで UDF 経由で Jar パッケージをロードする際、Jar パッケージにチェック層を追加するオプションがあります。以下の2つのパラメータ(タスクレベルパラメータ、エンジンの再起動不要)で調整可能です:
spark.sql.udf.check.jar:デフォルト値はfalseで、Jarパッケージのチェックを有効にします。
spark.sql.udf.check.timeout.milliseconds:デフォルト値は30000で、同期チェックの時間です。チェック時間がこの値を超えた場合、チェックを中止します。
チェックの内容は主に、Jarパッケージに問題がないか確認し、エンジンの実行環境を汚染しないようにすることで、以下を含みます:
指定されたUDFのクラスが存在するかどうかを確認します。
指定されたUDFのクラスが正常に初期化できるかどうかを確認します。例えば、static静的コードブロックが正常かどうかなどです。
指定されたJarパッケージに新しいClass-Pathが導入されているかどうかを確認します。例えば、META-INFでClass-Path: .が定義されている場合、循環ロードが発生する可能性があります。
指定されたJarパッケージの署名に問題がないかどうかを確認します。例えば、signatureが不正な場合、Jarパッケージがロードできなくなる可能性があります。
チェックに合格しない場合、「Resource/Class cannot be loaded safely, the source jar should be ignored」と表示され、問題のあるJarパッケージがエンジンにインストールされてクラスタが使用不能になるのを防ぎます。
関数を作成
方法1:SQLコマンドで作成
-一時的な関数を作成します(一時的な関数はJarパッケージをエンジンにリアルタイムでロードし、現在のセッションでのみ有効です)
create temp function DB.TEMP_FUNCTION as 'JAR_CLASS_NAME' using jar 'cosn://bucket/path/to/jar';
create function DB.FUNCTION as 'JAR_CLASS_NAME' using jar 'cosn://bucket/path/to/jar';
方法2:コンソールで作成
注意:
作成する関数がUDAF/UDTFの場合、関数名にそれぞれ_udaf/_udtfのサフィックスを追加する必要があります。
2. 左側のナビゲーションメニューからデータ管理に入り、作成する関数のデータベースを選択します。新しいデータベースを作成する必要がある場合は、データベース管理を参照してください。 3. 関数をクリックして、関数管理ページに入ります。
4. 関数を作成をクリックして作成します。
UDFのプログラムパッケージは、ローカルアップロードまたはCOSパス(COS関連の権限が必要)の選択をサポートしています。例として、COSパスを選択して作成します。
関数クラス名には「パッケージ情報」および「関数の実行クラス名」が含まれます。
関数を使用
2. 左側のナビゲーションメニューからデータ探索に入り、計算エンジンを選択すると、SQLを使用して関数を呼び出すことができます(注意:専用エンジンを選択してください。共有エンジンはカスタムudf関数の使用をサポートしていません)。
Python UDF 開発
Python UDF 機能を使用するには、クラスターを最新バージョンにアップグレードしてください。現在のクラスターがサポートされているかどうかは、チケットを提出する ことでご相談いただけます。 1. SuperSQL-S 1.0 バージョン(現在このバージョンのみサポート)のクラスターを選択して購入してください。
2. クラスターのPython UDF機能を有効にします。
デフォルトでは、Python UDF機能は有効になっていません。SuperSQLエンジンページで、有効にするエンジンを選択し、パラメータ設定をクリックして設定を追加してください。spark.sql.pyudf.enabled = trueと入力した後、確認をクリックして保存します。
SparkSQLクラスターはクラスターの再起動後に有効になります。
SparkBatchクラスタの次のタスクが有効になります。
3. Python UDF関数を登録します。
DLCは完全にコミュニティ互換のUDF関数をサポートします。
例として、以下のファイルdemo.pyを編集してください:
def name_sensitivity(name):
if len(name) > 2:
return name[0] + '*' * (len(name) - 2) + name[-1]
elif len(name) == 2:
return '*' + name[-1]
else:
return name
現在は単一のPythonファイルをサポートしています。
組み込みモジュールのimportのみサポートされています。
関数の入力と出力の型にご注意ください。
関数の例外処理にご注意ください。
4. データ探索インターフェースで、Python UDFをサポートするクラスターを使用し、Sessionパラメータeos.sql.processType=DIRECTを設定してください。このパラメータを編集できない場合は、チケットを提出してご連絡ください。
Python UDF関数を編集・変更する必要がある場合、SparkSQLクラスターのロードメカニズムには約30秒の遅延がありますが、SparkBatchクラスターでは次のタスクで即時有効になります。
現在のPython UDF関数を削除する必要がある場合、SparkSQLクラスターはクラスターの再起動が必要で、SparkBatchクラスターは次のタスクで即時有効になります。
Python関数編集権限の設定
Pythonで関数を作成する際、作成者と管理者に関数の編集権限の設定を許可します。手順は以下の通りです:
エントリー1:関数作成時に編集権限を設定する
2. 左側のメニューバーからメタデータ管理に入り、関数ページを選択し、関数欄の左上にある青色のボタン関数を作成をクリックしてページに入ります。 3. 関数編集権限の右側にある展開をクリックすると、作成者はユーザーまたはワークグループ(組み合わせて選択可能)を選択して、関数の「編集」と「削除」の権限を付与できます。作成者と管理者はデフォルトですべての権限を持っています。
4. 設定が完了したら、確定をクリックすると、関数編集権限の設定が完了します。
エントリー2:既存の関数の編集権限を設定する
2. 左側のメニューバーからメタデータ管理に入り、関数ページを選択し、編集したい関数の右側の操作欄にある編集ボタンをクリックすると、編集ページに移動できます。 3. 関数編集ページに移動した後、関数編集権限の右側にある展開をクリックすると、権限の変更と削除ができます。