All Products
Search
Document Center

Realtime Compute for Apache Flink:Fungsi skalar yang didefinisikan pengguna Python (UDSF)

Last Updated:Aug 14, 2026

Fungsi skalar yang didefinisikan pengguna (UDSF) memetakan nol, satu, atau beberapa nilai skalar ke satu nilai skalar tunggal. Setiap baris input menghasilkan tepat satu nilai output.

Topik ini menjelaskan cara membuat, mendaftarkan, dan menggunakan UDSF Python di Realtime Compute for Apache Flink.

Batasan

Batasan berikut berlaku saat Anda mengembangkan fungsi yang didefinisikan pengguna (UDF) Python di Realtime Compute for Apache Flink:

Constraint Requirement
Versi Apache Flink 1.12 dan versi setelahnya
Versi Python Telah terinstal sebelumnya di setiap ruang kerja. VVR sebelum 8.0.11: Python 3.7.9. VVR 8.0.11 dan versi setelahnya: Python 3.9.21.
Versi JDK JDK 8 dan JDK 11. Paket JAR pihak ketiga harus kompatibel dengan JDK 8 atau JDK 11.
Versi Scala Hanya Scala 2.11 open-source. Paket JAR pihak ketiga harus kompatibel dengan Scala 2.11.
Fungsi inline Didukung hanya pada VVR 11.9-preview1 dan versi setelahnya.
Penting

Setelah melakukan upgrade ke VVR 8.0.11 atau versi setelahnya, uji, terapkan, dan jalankan kembali draft PyFlink yang sudah ada untuk memastikan kompatibilitas.

Metode pengembangan

Anda dapat mengembangkan UDSF Python dengan salah satu cara berikut:

  • Kemas kode Python Anda, unggah paket tersebut, lalu daftarkan sebagai fungsi di platform.

  • Deklarasikan logika fungsi secara inline dalam pernyataan SQL.

Jika logika UDSF Anda sederhana, pertimbangkan untuk mengembangkannya sebagai fungsi inline.

Membuat UDSF

Langkah-langkah berikut menggunakan Windows sebagai contoh lingkungan. Flink menyediakan repositori contoh yang mencakup implementasi untuk UDSF, fungsi agregat yang didefinisikan pengguna (UDAF), dan fungsi bernilai tabel yang didefinisikan pengguna (UDTF).
  1. Unduh dan ekstrak python_demo-master ke mesin lokal Anda.

    Ini adalah repositori GitHub pihak ketiga. Akses mungkin lambat atau tidak stabil.
  2. Di PyCharm, pilih File > Open, lalu buka direktori python_demo-master yang telah diekstrak.

  3. Buka udfs.py pada path \python_demo-master\udx dan definisikan UDSF Anda.

    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]

    Contoh sub_string mengekstraksi karakter dari posisi begin hingga posisi end pada string input.

  4. Dari direktori \python_demo-master, jalankan perintah berikut untuk mengemas direktori udx:

    zip -r python_demo.zip udx

    Saat python_demo.zip muncul di \python_demo-master\, paket siap digunakan.

Mendaftarkan UDSF

Setelah membuat paket, daftarkan UDSF di konsol Realtime Compute for Apache Flink. Untuk langkah-langkah pendaftaran, lihat Mengelola fungsi yang didefinisikan pengguna (UDF).

Menggunakan UDSF

Setelah mendaftarkan UDSF, gunakan fungsi tersebut dalam pekerjaan Flink SQL.

  1. Buat draft menggunakan Flink SQL. Untuk detailnya, lihat Ikhtisar pengembangan pekerjaan. Contoh berikut memanggil ASI_UDSF (nama terdaftar UDSF Anda) untuk mengekstraksi karakter dari posisi 2 hingga 4 pada bidang a di tabel sumber:

    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. Di panel navigasi sebelah kiri Konsol pengembangan, pilih O&M > Deployments. Temukan penerapan tersebut, lalu klik Start di kolom Actions. Setelah penerapan dimulai, karakter pada posisi 2–4 dari bidang a di ASI_UDSF_Source akan ditulis ke ASI_UDSF_Sink.

Fungsi skalar inline Python

Fungsi inline menyematkan implementasinya langsung dalam pernyataan CREATE FUNCTION, sehingga fungsi tersebut didefinisikan dan didaftarkan dalam satu pernyataan SQL yang sama. Contoh berikut mendefinisikan fungsi inline yang menyamarkan alamat email. Deklarasikan seluruh logika fungsi di antara pembatas $$.

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;
Catatan
  1. Python sensitif terhadap indentasi. Mulailah kode tingkat pertama isi fungsi di kolom 0, dan pertahankan indentasi relatif yang benar di dalam blok kode.

  2. Fungsi inline tidak mendukung eksekusi vektorisasi dan tidak dapat dideklarasikan sebagai fungsi non-deterministik.

  3. Hanya fungsi TEMPORARY yang didukung. Definisi fungsi belum dapat dipertahankan di platform.

Fungsi yang didefinisikan pengguna asinkron

Untuk UDF yang melakukan operasi intensif I/O seperti akses database eksternal atau permintaan HTTP, gunakan fungsi yang didefinisikan pengguna asinkron. Satu UDF asinkron dapat menangani beberapa permintaan I/O secara konkuren, membagi waktu tunggu di antara permintaan, dan meningkatkan throughput pekerjaan.

Batasan

  • Hanya didukung pada VVR 11.7 dan versi setelahnya. Diperlukan VVR PyFlink 11.7 atau versi setelahnya. Untuk detailnya, lihat ververica-flink.

    pip3 install "ververica-flink>=11.7"

  • Hanya fungsi skalar yang didefinisikan pengguna asinkron (UDSF) yang didukung.

  • Hanya mode proses Python yang didukung, yaitu python.execution-mode=process.

  • Fungsi yang didefinisikan pengguna asinkron berbasis Pandas belum didukung.

  • Fungsi inline belum didukung.

Penggunaan

Fungsi yang didefinisikan pengguna asinkron dapat diimplementasikan sebagai fungsi async Python atau sebagai subclass dari kelas fungsi asinkron. Contoh kode ditampilkan di bawah ini.

import asyncio

from pyflink.table import DataTypes
from pyflink.table.udf import AsyncScalarFunction, udf


# Method 1: Use a Python async function
@udf(result_type=DataTypes.STRING())
async def async_api_call(product_id: str) -> str:
    await asyncio.sleep(0.05)
    return f"product_{product_id}"


# Method 2: Subclass the asynchronous function class
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()
)

Fungsi yang didefinisikan pengguna asinkron didaftarkan dan digunakan dengan cara yang sama seperti fungsi sinkron.

Parameter konfigurasi

Parameter berikut mengontrol perilaku waktu proses fungsi yang didefinisikan pengguna asinkron.

Parameter

Nilai default

Deskripsi

table.exec.async-scalar.max-concurrent-operations

10

Jumlah maksimum panggilan asinkron konkuren per instans operator. Nilai default: 10.

table.exec.async-scalar.timeout

3 min

Waktu timeout untuk satu panggilan asinkron.

table.exec.async-scalar.retry-strategy

FIXED_DELAY

Strategi pengulangan setelah panggilan asinkron gagal. Nilai yang didukung:

  • FIXED_DELAY: Ulangi setelah waktu tunggu tetap.

  • NO_RETRY: Jangan ulangi.

table.exec.async-scalar.retry-delay

100 ms

Waktu tunggu untuk pengulangan dengan penundaan tetap.

Catatan

Hanya berlaku saat table.exec.async-scalar.retry-strategy diatur ke FIXED_DELAY.

table.exec.async-scalar.max-attempts

3

Jumlah maksimum upaya sebelum panggilan asinkron dianggap gagal.

Catatan

Hanya berlaku saat table.exec.async-scalar.retry-strategy diatur ke FIXED_DELAY.