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

Realtime Compute for Apache Flink:Python ユーザー定義スカラー関数 (UDSF)

最終更新日:Aug 14, 2026

ユーザー定義スカラー関数 (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) の実装を含む サンプルリポジトリ を提供しています。
  1. python_demo-master をローカルマシンにダウンロードして解凍します。

    これはサードパーティの GitHub リポジトリです。アクセスが遅い、または断続的になる場合があります。
  2. PyCharm で、[File] > [Open] を選択し、解凍した python_demo-master ディレクトリを開きます。

  3. \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 の直前までの文字を抽出します。

  4. \python_demo-master ディレクトリから、次のコマンドを実行して udx ディレクトリをパッケージ化します。

    zip -r python_demo.zip udx

    python_demo.zip が \python_demo-master\ に表示されると、パッケージの準備は完了です。

UDSFの登録

パッケージを作成した後、Realtime Compute for Apache Flink コンソールで UDSF を登録します。登録手順については、「ユーザー定義関数 (UDF) の管理」をご参照ください。

UDSFの使用方法

UDSF を登録した後、Flink SQL ジョブで使用します。

  1. 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;
  2. 開発コンソールの左側のメニューで [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;
説明
  1. Python ではインデントが重要です。関数本体の第 1 レベルのコードを行頭から開始し、コードブロック内で正しい相対インデントを維持してください。

  2. インライン関数はベクトル化実行をサポートしておらず、非決定性関数として宣言することもできません。

  3. 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

非同期呼び出しが失敗した後のリトライ戦略。サポートされている値:

  • FIXED_DELAY:固定の待機時間の後にリトライします。

  • NO_RETRY:リトライしません。

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 に設定されている場合にのみ有効です。