ユーザー定義スカラー関数 (UDSF) は、0 個、1 個、または複数のスカラー値を単一のスカラー値にマッピングします。各入力行は、厳密に 1 つの出力値を生成します。
このトピックでは、Realtime Compute for Apache Flink で Python UDSF を作成、登録、使用する方法について説明します。
制限事項
Realtime Compute for Apache Flink で Python ユーザー定義関数 (UDF) を開発する場合、次の制約が適用されます。
| 制約 | 要件 |
|---|---|
| Apache Flink バージョン | 1.12 以降 |
| Python バージョン | すべてのワークスペースにプリインストールされています。VVR 8.0.11 より前のバージョンでは Python 3.7.9 が、VVR 8.0.11 以降のバージョンでは Python 3.9.21 が使用されます。 |
| JDK バージョン | JDK 8 および JDK 11。サードパーティの JAR パッケージは、JDK 8 または JDK 11 との互換性が必要です。 |
| Scala バージョン | オープンソースの Scala 2.11 のみ。サードパーティの JAR パッケージは、Scala 2.11 との互換性が必要です。 |
| インライン関数 | VVR 11.9-preview1 以降でのみサポートされます。 |
VVR 8.0.11 以降にアップグレードした後、既存の PyFlink ドラフトを再度テスト、デプロイ、実行して互換性を確認してください。
開発方法
Python UDSF は、次のいずれかの方法で開発できます。
-
Python コードをパッケージ化し、パッケージをアップロードして、プラットフォームに関数として登録します。
-
SQL 文でコードロジックをインライン関数として宣言します。
UDSF のロジックが単純な場合は、インライン関数として開発することを検討してください。
UDSFの作成
以下の手順では、Windows をサンプル環境として使用します。Flink は、UDSF、ユーザー定義集計関数 (UDAF)、およびユーザー定義テーブル値関数 (UDTF) の実装を含む サンプルリポジトリ を提供しています。
-
python_demo-master をローカルマシンにダウンロードして解凍します。
これはサードパーティの GitHub リポジトリです。アクセスが遅い、または断続的になる場合があります。
-
PyCharm で、[File] > [Open] を選択し、解凍した
python_demo-masterディレクトリを開きます。 -
\python_demo-master\udxパス内にあるudfs.pyを開き、UDSF を定義します。from pyflink.table import DataTypes from pyflink.table.udf import udf @udf(result_type=DataTypes.STRING()) def sub_string(s: str, begin: int, end: int): return s[begin:end]sub_stringの例では、入力文字列のインデックスbeginからendの直前までの文字を抽出します。 -
\python_demo-masterディレクトリから、次のコマンドを実行してudxディレクトリをパッケージ化します。zip -r python_demo.zip udxpython_demo.zipが\python_demo-master\に表示されると、パッケージの準備は完了です。
UDSFの登録
パッケージを作成した後、Realtime Compute for Apache Flink コンソールで UDSF を登録します。登録手順については、「ユーザー定義関数 (UDF) の管理」をご参照ください。
UDSFの使用方法
UDSF を登録した後、Flink SQL ジョブで使用します。
-
Flink SQL を使用してドラフトを作成します。詳細については、「ジョブ開発の概要」をご参照ください。次の例では、
ASI_UDSF(登録した UDSF の名前) を呼び出して、ソーステーブルのaフィールドのインデックス 2 から 4 の直前まで (インデックス 2 と 3) の文字を抽出します。CREATE TEMPORARY TABLE ASI_UDSF_Source ( a VARCHAR, b INT, c INT ) WITH ( 'connector' = 'datagen' ); CREATE TEMPORARY TABLE ASI_UDSF_Sink ( a VARCHAR ) WITH ( 'connector' = 'blackhole' ); INSERT INTO ASI_UDSF_Sink SELECT ASI_UDSF(a, 2, 4) FROM ASI_UDSF_Source; -
開発コンソールの左側のメニューで [O&M] > [Deployments] を選択します。対象のデプロイメントを見つけ、その [Actions] 列にある [Start] をクリックします。デプロイメントが開始されると、
ASI_UDSF_Sourceのaフィールドのインデックス 2 から 4 の直前まで (インデックス 2 と 3) の文字がASI_UDSF_Sinkに書き込まれます。
Pythonインラインスカラー関数
インライン関数は、その実装を CREATE FUNCTION 文に直接埋め込むため、関数は同じ SQL 文内で定義および登録されます。次の例では、メールアドレスをマスクするインライン関数を定義します。$$ 区切り文字の間に完全なコードロジックを記述します。
CREATE TEMPORARY FUNCTION mask_email(email STRING)
RETURNS STRING AS $$
if email is None:
return None
name, separator, domain = email.partition("@")
if not separator:
return email
return name[:1] + "***@" + domain
$$ LANGUAGE PYTHON;
-
Python ではインデントが重要です。関数本体の第 1 レベルのコードを行頭から開始し、コードブロック内で正しい相対インデントを維持してください。
-
インライン関数はベクトル化実行をサポートしておらず、非決定性関数として宣言することもできません。
-
TEMPORARY 関数のみがサポートされています。関数定義はまだプラットフォームに永続化できません。
非同期ユーザー定義関数
外部データベースへのアクセスや HTTP リクエストなど、I/O 集中型の操作を実行する UDF には、非同期ユーザー定義関数を使用します。単一の非同期 UDF は複数の I/O リクエストを同時に処理でき、リクエスト間で待機時間を分散させ、ジョブのスループットを向上させます。
制限事項
-
VVR 11.7 以降でのみサポートされます。VVR PyFlink 11.7 以降が必要です。詳細については、「ververica-flink」をご参照ください。
pip3 install "ververica-flink>=11.7" -
非同期ユーザー定義スカラー関数 (UDSF) のみがサポートされます。
-
Python プロセスモードのみがサポートされます。つまり、
python.execution-mode=processです。 -
Pandas 非同期ユーザー定義関数はまだサポートされていません。
-
インライン関数はまだサポートされていません。
使用方法
非同期ユーザー定義関数は、Python の非同期関数として、または非同期関数クラスのサブクラスとして実装できます。サンプルコードを以下に示します。
import asyncio
from pyflink.table import DataTypes
from pyflink.table.udf import AsyncScalarFunction, udf
# 方法1: Pythonの非同期関数を使用
@udf(result_type=DataTypes.STRING())
async def async_api_call(product_id: str) -> str:
await asyncio.sleep(0.05)
return f"product_{product_id}"
# 方法2: 非同期関数クラスをサブクラス化
class AsyncUserLookup(AsyncScalarFunction):
def open(self, function_context):
self.cache = {}
async def eval(self, user_id: str) -> str:
if user_id in self.cache:
return self.cache[user_id]
await asyncio.sleep(0.05)
result = f"user_{user_id}"
self.cache[user_id] = result
return result
def close(self):
self.cache.clear()
async_user_lookup = udf(
AsyncUserLookup(),
input_types=[DataTypes.STRING()],
result_type=DataTypes.STRING()
)
非同期ユーザー定義関数は、同期関数と同じ方法で登録および使用されます。
設定パラメーター
以下のパラメーターは、非同期ユーザー定義関数のランタイム動作を制御します。
|
パラメーター |
デフォルト値 |
説明 |
|
table.exec.async-scalar.max-concurrent-operations |
10 |
オペレーターインスタンスあたりの同時非同期呼び出しの最大数。デフォルト値:10。 |
|
table.exec.async-scalar.timeout |
3 min |
単一の非同期呼び出しのタイムアウト。 |
|
table.exec.async-scalar.retry-strategy |
FIXED_DELAY |
非同期呼び出しが失敗した後のリトライ戦略。サポートされている値:
|
|
table.exec.async-scalar.retry-delay |
100 ms |
固定遅延リトライの待機時間。 説明
table.exec.async-scalar.retry-strategy が FIXED_DELAY に設定されている場合にのみ有効です。 |
|
table.exec.async-scalar.max-attempts |
3 |
非同期呼び出しが失敗したと見なされるまでの最大試行回数。 説明
table.exec.async-scalar.retry-strategy が FIXED_DELAY に設定されている場合にのみ有効です。 |