API Python DataFrame menyediakan antarmuka bergaya DataFrame dalam Python untuk menulis job Flink. API ini menawarkan operasi dasar seperti filter, project, join, dan aggregate sehingga Anda dapat menyatakan logika pemrosesan data dalam gaya aljabar relasional. API DataFrame juga memungkinkan Anda menulis user-defined function (UDF) dalam Python untuk mengakomodasi logika bisnis yang tidak dapat diekspresikan oleh operator standar. Selain itu, API DataFrame menyediakan kemampuan AI/LLM yang terintegrasi langsung ke dalam pipa data Anda, dengan fungsi AI siap pakai untuk klasifikasi, analisis sentimen, ekstraksi, terjemahan, ringkasan, dan embedding. Topik ini menjelaskan API yang didukung sebagai referensi pengembangan job. Untuk dokumentasi API lengkap, lihat PyFlink DataFrame.
Operasi DataFrame
Tabel berikut merangkum operasi inti pada DataFrame.
|
Kategori |
API |
|
Construct / create |
from_table, from_pandas, from_arrow, from_dict, from_records, range |
|
Attributes |
|
|
Projection / column operations |
select, with_column, with_columns, drop_columns, rename_columns |
|
Filter |
|
|
Aggregation |
|
|
Join / union |
|
|
Row mapping |
|
|
Explode |
|
|
Deduplication |
|
|
Set operations |
union, union_all, minus, minus_all, intersect, intersect_all |
|
Limit / pagination |
|
|
Partition |
|
|
Pipe |
|
|
Null handling |
|
|
Output / collect |
|
|
Debug / execution plan |
|
|
SQL |
Fungsi pembantu ekspresi
|
Fungsi |
Deskripsi |
|
Membuat ekspresi referensi kolom. |
|
|
Membuat ekspresi literal. |
Tipe data
DataType digunakan untuk mendeskripsikan tipe kolom DataFrame.
|
Kategori tipe |
Metode |
|
Boolean |
|
|
Integer |
DataType.int8, DataType.int16, DataType.int32, DataType.int64 |
|
Float / fixed-point |
|
|
String |
|
|
Binary |
|
|
Date / time |
DataType.date, DataType.time, DataType.timestamp, DataType.timestamp_ltz |
|
Composite |
|
|
Special |
|
|
Multimodal |
|
|
Nullability modifier |
DataType dapat digunakan untuk menentukan skema sumber data, tipe output UDF, dan sebagainya. Contohnya, gunakan DataType untuk menentukan skema sumber Kafka:
import pyflink.dataframe as pf
from pyflink.dataframe import DataType
df = pf.read_kafka(
"localhost:9092",
topic="user_events",
schema={
"user_id": DataType.string(),
"event_type": DataType.string(),
"amount": DataType.decimal(10, 2),
"tags": DataType.list(DataType.string()),
"event_time": DataType.timestamp_ltz(3),
},
format="json",
startup_mode="earliest-offset",
)
DataType.tensor mendukung tensor bentuk variabel. Di dalam UDF, Anda dapat menggunakan metode bawaan untuk mengonversi antara tensor bentuk variabel dan ndarray NumPy:
from pyflink.dataframe.tensor import variable_tensors_to_arrow
result_type = DataType.struct({
"id": DataType.int64(),
# Tidak ada bentuk yang ditentukan: tensor panjang variabel
"tensor": DataType.tensor("float32"),
})
def transpose_batch_tensor(batch):
# Panggil to_numpy() untuk mengonversi kolom tensor panjang variabel menjadi object ndarray.
# Setiap elemen adalah ndarray mandiri, dan bentuknya bisa berbeda.
tensors = batch["tensor"].to_numpy()
transposed = [
None if tensor is None else tensor.T
for tensor in tensors
]
return {
"id": batch["id"],
# Konversi kembali kolom ndarray panjang variabel menjadi kolom tensor Arrow panjang variabel
"tensor": variable_tensors_to_arrow(
transposed,
dtype="float32",
),
}
Tensor bentuk variabel didukung mulai dari VVR 11.9.preview.1.
I/O
DataFrame menyediakan serangkaian kaya API I/O untuk membaca dan menulis sumber data umum. Anda juga dapat menggunakan fungsi read_generic atau write_generic untuk bekerja dengan connector lain yang didukung atau connector kustom untuk membaca dan menulis data.
Baca data
|
Sumber |
API |
|
File Parquet |
|
|
File JSON |
|
|
Kafka |
|
|
MaxCompute (ODPS) |
|
|
Paimon |
|
|
SLS (Simple Log Service) |
|
|
Hologres |
|
|
Milvus |
|
|
Frame video |
|
|
Connector generik / kustom |
Tulis data
|
Sink |
API |
|
File Parquet |
|
|
File JSON |
|
|
Kafka |
|
|
MaxCompute (ODPS) |
|
|
Paimon |
|
|
SLS (Simple Log Service) |
|
|
Hologres |
|
|
Milvus |
|
|
|
Didukung mulai dari VVR 11.9.preview.1. |
|
Connector generik / kustom |
Jika satu job perlu menulis data beberapa kali, gunakan create_statement_set untuk membuat StatementSet dan menjalankan semua fungsi write secara bersamaan.
Gunakan Catalog
API DataFrame dapat menggunakan Catalog dan membaca dari atau menulis ke tabel Catalog.
|
API |
Deskripsi |
|
Buat Catalog |
|
|
Ambil objek Catalog yang terdaftar |
|
|
Ganti Catalog saat ini |
|
|
Ambil Catalog saat ini |
|
|
Daftar Catalog |
|
|
Ganti database saat ini |
|
|
Ambil database saat ini |
|
|
Daftar database di Catalog saat ini |
|
|
Baca tabel Catalog sebagai DataFrame |
|
|
Tulis DataFrame ke tabel Catalog |
Fungsi yang didefinisikan pengguna
Fungsi skalar yang didefinisikan pengguna udf
Fungsi skalar yang didefinisikan pengguna mengubah setiap baris input menjadi satu nilai hasil. Fungsi ini dapat berupa salah satu dari empat jenis:
-
UDF baris sinkron: Fungsi Python biasa yang memproses satu baris dalam satu waktu.
-
UDF baris asinkron: Cocok untuk memanggil layanan eksternal atau logika intensif I/O; memungkinkan beberapa baris melakukan I/O secara konkuren untuk meningkatkan throughput.
-
UDF vektor sinkron: Menerima dan mengembalikan data dalam batch, mengurangi overhead per-baris antara Python dan runtime Flink. Cocok untuk komputasi murni.
-
UDF vektor asinkron: Menggabungkan throughput batch dengan konkurensi I/O asinkron.
Daftarkan fungsi skalar
Decorator udf mendaftarkan fungsi Python sebagai fungsi skalar untuk digunakan dalam DataFrame.
-
Nama API: udf.
udf( func=None, *, return_dtype=None, deterministic=True, name=None, func_type=None, concurrency=None, batch_size=None, num_gpus=None, gpu_type=None ) -
Deskripsi: Mendaftarkan fungsi Python sebagai UDF skalar DataFrame. Mendukung fungsi biasa, fungsi async, subclass ScalarFunction / AsyncScalarFunction, dan kelas callable.
-
Parameter
Nama parameter
Tipe parameter
Wajib
Deskripsi
func
Callable / Class
Tidak
Fungsi Python, instance/subclass ScalarFunction, atau kelas callable yang akan dibungkus. Jika dihilangkan, decorator dikembalikan.
return_dtype
DataType / str / type
Tidak
Tipe kembalian. Dapat berupa instance
DataType(misalnya,DataType.int64()), tipe Python (misalnya,int), atau string tipe SQL (misalnya,'BIGINT'). Jika dihilangkan, akan diinferensi otomatis dari type hints fungsi.deterministic
Boolean
Tidak
Apakah fungsi tersebut deterministik. Default:
True.name
String
Tidak
Nama UDF. Defaultnya adalah nama fungsi.
func_type
String
Tidak
Format eksekusi. Opsi:
"general","pandas","arrow". Jika dihilangkan, akan dideteksi otomatis dari type hints fungsi.concurrency
int
Tidak
Paralelisme operator UDF. UDF dengan nilai concurrency berbeda dipisahkan menjadi operator terpisah.
batch_size
int
Tidak
Jumlah maksimum elemen per batch. Hanya berlaku untuk UDF batch (mode pandas / arrow).
num_gpus
float
Tidak
Jumlah GPU yang diminta untuk UDF (misalnya, 0,5, 1). Saat diatur, UDF berjalan di operator terpisah dan tidak dirantai dengan UDF lain (termasuk UDF GPU lain).
gpu_type
String
Tidak
Tipe GPU. Wajib ditentukan saat num_gpus disetel.
-
Nilai kembalian
Objek DataFrameUDFWrapper yang dapat digunakan dalam
with_column,with_columns,map,map_batches, dan operasi serupa.
UDF baris sinkron
Di <a href="https://ververica-flink-docs.readthedocs.io/en/latest/reference/pyflink.dataframe/api/pyflink.dataframe.DataFrame.with_column.html#pyflink.dataframe.DataFrame.with_column" id="9bd1023ff8zhv">with_column</a> atau <a href="https://ververica-flink-docs.readthedocs.io/en/latest/reference/pyflink.dataframe/api/pyflink.dataframe.DataFrame.with_columns.html#pyflink.dataframe.DataFrame.with_columns" id="f6f90f4fb81f2">with_columns</a> Digunakan di
UDF skalar mengambil satu atau beberapa kolom dan mengembalikan satu kolom. Gunakan type hints Python untuk inferensi otomatis tipe kembalian, atau gunakan return_dtype untuk menentukannya secara eksplisit. Saat mendefinisikan UDF, Anda dapat menggunakan concurrency untuk mengatur konkurensi.
Mulai dari VVR 11.9.preview.1, Anda dapat mendeklarasikan UDF dengan menggunakan kelas callable. Definisikan logika inisialisasi dan eksekusi UDF di __init__ dan __call__.
from pyflink.dataframe import col, udf
orders = pf.from_records(
[
(1001, 1, 99.9, "PAID"),
(1002, 2, 35.5, "CREATED"),
(1003, 1, 188.0, "PAID"),
(1004, 3, 88.8, None),
],
schema=["order_id", "user_id", "amount", "status"],
)
@udf
def normalize_status(status: str) -> str:
if status is None:
return "UNKNOWN"
return status.strip().upper()
@udf(concurrency=32)
def order_tag(amount: float, status: str) -> str:
"""Mengambil beberapa kolom sebagai input"""
if status == "PAID" and amount is not None and amount >= 100:
return "high_value_paid"
return "normal"
@udf
class ModelPredictor:
def __init__(self):
# Inisialisasi dieksekusi di task manager
self._model = load_model()
def __call__(self, amount: float) -> str:
return self._model.predict(amount)
# with_column menambahkan satu kolom
orders_with_status = orders.with_column(
"status_norm", normalize_status(col("status"))
)
# with_columns menambahkan beberapa kolom sekaligus
orders_with_flags = orders.with_columns(
status_norm=normalize_status(col("status")),
tag=order_tag(col("amount"), col("status")),
)
# Gunakan UDF stateful
orders_with_predictions = orders.with_column(
"prediction", ModelPredictor(col("amount"))
)
Di <a href="https://ververica-flink-docs.readthedocs.io/en/latest/reference/pyflink.dataframe/api/pyflink.dataframe.DataFrame.map.html#pyflink.dataframe.DataFrame.map" id="39c01bde1d7d5">map</a> Digunakan di
map mengambil seluruh baris dan mengembalikan baris baru. Kolom input diakses berdasarkan nama di dalam fungsi. Tipe kembalian dapat dideklarasikan dengan DataType.struct untuk deklarasi eksplisit, atau melalui type hints TypedDict untuk inferensi otomatis. Anda dapat mengoper fungsi Python langsung ke map tanpa menggunakan udf sebagai decorator.
Gunakan return_dtype untuk deklarasi eksplisit
def build_order_feature(row):
amount = row["amount"] or 0.0
return {
"order_id": row["order_id"],
"user_id": row["user_id"],
"feature": f"{row['status']}:{'large' if amount >= 100 else 'normal'}",
}
order_features = orders.map(
build_order_feature,
return_dtype=DataType.struct({
"order_id": DataType.int64(),
"user_id": DataType.int64(),
"feature": DataType.string(),
}),
)
Gunakan TypedDict untuk deteksi otomatis
from typing import TypedDict
class OrderFeature(TypedDict):
order_id: int
user_id: int
feature: str
def build_order_feature_typed(row) -> OrderFeature:
amount = row["amount"] or 0.0
return {
"order_id": row["order_id"],
"user_id": row["user_id"],
"feature": f"{row['status']}:{'large' if amount >= 100 else 'normal'}",
}
order_features_typed = orders.map(build_order_feature_typed)
UDF vektor sinkron
Di <a data-init-id="9bd1023ff8zhv" href="https://ververica-flink-docs.readthedocs.io/en/latest/reference/pyflink.dataframe/api/pyflink.dataframe.DataFrame.with_column.html#pyflink.dataframe.DataFrame.with_column" id="e6c50a17edh0o">with_column</a> atau <a data-init-id="f6f90f4fb81f2" href="https://ververica-flink-docs.readthedocs.io/en/latest/reference/pyflink.dataframe/api/pyflink.dataframe.DataFrame.with_columns.html#pyflink.dataframe.DataFrame.with_columns" id="8a50565ecf76z">with_columns</a> Digunakan di
UDF vektorisasi menerima dan mengembalikan data dalam batch, mengurangi overhead per-baris antara Python dan runtime Flink. UDF ini cocok untuk komputasi murni. Mendukung format Pandas (pandas.Series) dan Arrow (pyarrow.Array). Pilih berdasarkan logika UDF Anda. Gunakan batch_size untuk mengontrol ukuran batch. Jumlah baris yang dikembalikan oleh UDF harus sama dengan jumlah baris input.
Format Pandas
import pandas as pd
@udf(return_dtype=DataType.float64(), concurrency=32, batch_size=64)
def scale_amount_pandas(amounts: pd.Series) -> pd.Series:
return amounts * 100.0
orders_scaled_pandas = orders.with_column(
"amount_scaled", scale_amount_pandas(col("amount")),
)
Arrow Format
import pyarrow as pa
import pyarrow.compute as pc
@udf(return_dtype=DataType.float64(), concurrency=32, batch_size=64)
def scale_amount_arrow(amounts: pa.Array) -> pa.Array:
return pc.multiply(amounts, 100.0)
orders_scaled_arrow = orders.with_column(
"amount_scaled", scale_amount_arrow(col("amount")),
)
Di <a href="https://ververica-flink-docs.readthedocs.io/en/latest/reference/pyflink.dataframe/api/pyflink.dataframe.DataFrame.map_batches.html#pyflink.dataframe.DataFrame.map_batches" id="d500967377ztd">map_batches</a> Digunakan di
map_batches melakukan pemrosesan vektorisasi pada seluruh baris. Saat batch_format="pandas", input dan output fungsi berupa dict[str, pandas.Series]. Saat batch_format="arrow", input dan output berupa dict[str, pyarrow.Array]. Anda dapat mengoper fungsi Python langsung ke map_batches tanpa membungkusnya dengan decorator udf.
Format Pandas
def score_batch_pandas(batch: dict[str, pd.Series]) -> dict[str, pd.Series]:
amount = batch["amount"].fillna(0.0)
return {
"order_id": batch["order_id"],
"score": (amount / 100.0).clip(0.0, 1.0),
}
order_scores_pandas = orders.map_batches(
score_batch_pandas,
batch_format="pandas",
batch_size=1024,
return_dtype=DataType.struct(
{
"order_id": DataType.int64(),
"score": DataType.float64(),
}
),
)
Arrow Format
def score_batch_arrow(batch: dict[str, pa.Array]) -> dict[str, pa.Array]:
amount = pc.if_else(pc.is_null(batch["amount"]), 0.0, batch["amount"])
raw_score = pc.divide(pc.cast(amount, pa.float64()), 100.0)
score = pc.if_else(
pc.less(raw_score, 0.0),
0.0,
pc.if_else(pc.greater(raw_score, 1.0), 1.0, raw_score),
)
return {
"order_id": batch["order_id"],
"score": score,
}
order_scores_arrow = orders.map_batches(
score_batch_arrow,
batch_format="arrow",
batch_size=1024,
return_dtype=DataType.struct(
{
"order_id": DataType.int64(),
"score": DataType.float64(),
}
),
)
UDF baris asinkron
UDF asinkron memungkinkan beberapa baris melakukan operasi I/O secara bersamaan, yang meningkatkan throughput. Fungsi ini cocok untuk logika yang memanggil layanan eksternal atau yang intensif I/O. Anda dapat memanggil UDF asinkron berbasis baris di dalam <a href="https://ververica-flink-docs.readthedocs.io/en/latest/reference/pyflink.dataframe/api/pyflink.dataframe.DataFrame.with_column.html#pyflink.dataframe.DataFrame.with_column" id="a4862ccb65o83">with_column</a>, <a href="https://ververica-flink-docs.readthedocs.io/en/latest/reference/pyflink.dataframe/api/pyflink.dataframe.DataFrame.with_columns.html#pyflink.dataframe.DataFrame.with_columns" id="1b48944541kmy">with_columns</a>, atau map.
import asyncio
# Gunakan di `with_column`
@udf(concurrency=32)
async def query_region(user_id: int) -> str:
await asyncio.sleep(0.01) # simulasi I/O asinkron
return f"region_for_{user_id}"
orders_with_region = orders.with_column(
"region", query_region(col("user_id")),
)
# Gunakan di `map`
class OrderWithRegion(TypedDict):
order_id: int
region: str
async def enrich_order_region(row) -> OrderWithRegion:
await asyncio.sleep(0.01) # Simulasi I/O asinkron
return {
"order_id": row["order_id"],
"region": f"region_for_{row['user_id']}",
}
orders_with_region = orders.map(enrich_order_region)
UDF vektor asinkron
UDF vektorisasi asinkron menggabungkan throughput pemrosesan batch dengan konkurensi I/O asinkron. Gunakan batch_size untuk mengontrol ukuran setiap batch. Anda dapat memanggil UDF vektorisasi asinkron di with_column, with_columns, atau map_batches.
# Gunakan di `with_column`
@udf(return_dtype=DataType.string(), concurrency=32, batch_size=64)
async def batch_enrich(statuses: pd.Series) -> pd.Series:
async def enrich_one(s):
await asyncio.sleep(0.01) # simulasi panggilan API asinkron
return f"enriched_{s}"
tasks = [enrich_one(s) for s in statuses]
results = await asyncio.gather(*tasks)
return pd.Series(results)
orders_enriched = orders.with_column(
"status_enriched", batch_enrich(col("status")),
)
# Gunakan di `map_batches`
async def enrich_order_batch(
batch: dict[str, pd.Series],
) -> dict[str, pd.Series]:
async def query_region(user_id):
await asyncio.sleep(0.01) # Simulasikan I/O asinkron
return f"region_for_{user_id}"
regions = await asyncio.gather(
*(query_region(user_id) for user_id in batch["user_id"])
)
return {
"order_id": batch["order_id"],
"region": pd.Series(
regions,
index=batch["user_id"].index,
),
}
orders_with_region = orders.map_batches(
enrich_order_batch,
batch_format="pandas",
batch_size=64,
concurrency=32,
return_dtype=DataType.struct({
"order_id": DataType.int64(),
"region": DataType.string(),
}),
)
Pemanggilan UDF asinkron di map dan map_batches didukung mulai dari VVR 11.9.preview.1.
Fungsi tabel yang didefinisikan pengguna udtf
Fungsi tabel yang didefinisikan pengguna memperluas satu baris input menjadi sejumlah baris output, dan setiap baris output dapat berisi satu atau beberapa kolom hasil.
Daftarkan fungsi tabel
Decorator udtf mendaftarkan fungsi Python sebagai fungsi tabel untuk digunakan dalam DataFrame.
-
Nama API: udtf.
udtf( func=None, *, return_dtype=None, deterministic=True, name=None, concurrency=None, num_gpus=None, gpu_type=None ) -
Deskripsi: Mendaftarkan fungsi Python, subclass atau instance
TableFunction, atau kelas callable sebagai fungsi tabel untuk digunakan dalam DataFrame. -
Parameter
Nama parameter
Tipe parameter
Wajib
Deskripsi
func
Callable / Class
Tidak
Fungsi Python, instance/subclass TableFunction, atau kelas callable yang akan dibungkus. Jika dihilangkan, decorator dikembalikan.
return_dtype
DataType / str / type
Tidak
Tipe setiap baris output. Untuk output multi-kolom, gunakan
DataType.struct({...})atauTypedDict.deterministic
Boolean
Tidak
Apakah fungsi tersebut deterministik. Default:
True.name
String
Tidak
Nama UDTF. Defaultnya adalah nama fungsi.
concurrency
int
Tidak
Paralelisme operator UDTF.
num_gpus
float
Tidak
Jumlah GPU yang diminta untuk UDTF (misalnya, 0,5, 1). Saat diatur, UDTF berjalan di operator terpisah dan tidak dirantai dengan UDF lain (termasuk UDF GPU lain).
gpu_type
String
Tidak
Tipe GPU. Wajib ditentukan saat num_gpus disetel.
-
Nilai kembalian
Objek DataFrameUDTFWrapper yang dapat digunakan dalam
flat_mapataujoin_lateral.
Di join_lateral Digunakan di
join_lateral menambahkan hasil UDTF setelah baris input asli. Secara default, baris input yang tidak menghasilkan output UDTF dihapus; Anda dapat mengatur ignore_empty=False untuk menyimpan baris input tanpa output UDTF.
from typing import Iterator, Tuple
from pyflink.dataframe import udtf
# Gunakan type hint dan .alias() untuk menentukan tipe kembalian dan nama kolom
@udtf
def split_words(text: str) -> Iterator[Tuple[str, int]]:
for word in text.split():
yield word, len(word)
words_with_source = texts.join_lateral(
split_words(col("text")).alias("word", "word_length"),
ignore_empty=False,
)
# Atau gunakan return_dtype
@udtf(return_dtype=DataType.struct({
"word": DataType.string(),
"word_length": DataType.int32(),
}))
def split_words_with_length(text):
for word in text.split():
yield {"word": word, "word_length": len(word)}
words_with_detail = texts.join_lateral(
split_words_with_length(col("text")),
)
Di flat_map Digunakan di
<a href="https://ververica-flink-docs.readthedocs.io/en/latest/reference/pyflink.dataframe/api/pyflink.dataframe.DataFrame.flat_map.html#pyflink.dataframe.DataFrame.flat_map" id="35bfeae711bka">flat_map</a> memanggil UDTF pada setiap baris. Hasilnya hanya berisi kolom output UDTF, dan kolom input asli tidak dipertahankan. Anda dapat meneruskan fungsi Python secara langsung ke flat_map tanpa membungkusnya dengan decorator udtf.
from typing import Any, Dict, Iterator, TypedDict
# Gunakan type hint dengan TypedDict untuk menentukan tipe kembalian dan nama kolom
class Word(TypedDict):
word: str
length: int
def split_row(row: Dict[str, Any]) -> Iterator[Word]:
for word in row["text"].split():
yield {"word": word, "length": len(word)}
words = texts.flat_map(split_row)
# Atau gunakan return_dtype
def split_row_with_dtype(row):
for word in row["text"].split():
yield {"word": word}
words_with_dtype = texts.flat_map(
split_row_with_dtype,
return_dtype=DataType.struct({"word": DataType.string()}),
)
Fungsi AI / LLM
DataFrame menyediakan serangkaian fungsi AI bawaan melalui aksesori df.llm. Untuk referensi API lengkap, lihat AI/LLM.
Konfigurasi penyedia
Sebelum menggunakan fungsi AI, daftarkan penyedia model terlebih dahulu.
|
API |
Deskripsi |
|
Daftarkan penyedia model. |
|
|
Atur penyedia default (untuk skenario multi-penyedia). |
|
|
Daftar penyedia yang terdaftar. |
Tipe penyedia yang didukung:
|
Penyedia |
Kasus penggunaan |
|
OpenAI, DeepSeek, DashScope (Model Studio), dan semua antarmuka yang kompatibel dengan OpenAI. |
|
|
Alibaba Cloud DashScope, yang mendukung embedding multimoda. |
|
|
NVIDIA Triton Inference Server |
|
|
Menggunakan penyedia model kustom yang terdaftar. |
set_model_provider
-
Nama API: set_model_provider.
set_model_provider( name_or_provider, provider=None, **options ) -
Deskripsi: Mendaftarkan konfigurasi global Penyedia Model. Tiga pola pemanggilan didukung: mengoper instance
ModelProvider; mengoper nama plus instanceModelProvider; atau mengoper nama plus argumen kata kunci. Nama yang terdaftar harus unik. Mendaftarkan penyedia dengan nama yang sudah ada akan memunculkanValueError. -
Parameter
Nama parameter
Tipe parameter
Wajib
Deskripsi
name_or_provider
ModelProvider / String
Ya
Instance
ModelProvider, yang didaftarkan secara otomatis di bawah identifier penyedianya, atau string nama kustom.provider
ModelProvider
Tidak
Instance
ModelProvider. Hanya digunakan saat argumen pertama adalah string nama.**options
key=value
Tidak
Item konfigurasi penyedia. Hanya digunakan saat argumen pertama adalah string nama dan tidak ada penyedia yang dioper. Saat argumen pertama adalah
openai-compat,dashscope, atautriton, penyedia yang sesuai dibuat. Jika tidak,GenericProviderdibuat. -
Nilai kembalian
None.
-
Contoh
# Opsi 1: oper instance ModelProvider langsung pf.set_model_provider(pf.OpenAICompatProvider(task="chat/completions")) # Opsi 2: nama kustom + instance ModelProvider (daftarkan beberapa) pf.set_model_provider("chat", pf.OpenAICompatProvider(task="chat/completions")) pf.set_model_provider("embedding", pf.OpenAICompatProvider(task="embeddings")) # Opsi 3: nama + argumen kata kunci pf.set_model_provider("dashscope", task="chat/completions")
Pemanggilan generik
-
Nama API: predict.
DataFrame.llm.predict( *input_cols, provider=None, model=None, output_type=None, cache_table=None, cache_key=None, config=None, **kwargs ) -
Deskripsi: Melakukan inferensi model generik. Mengirim kolom input yang ditentukan ke model dan menambahkan kolom output model ke DataFrame.
-
Parameter
Nama parameter
Tipe parameter
Wajib
Deskripsi
*input_cols
String
Ya
Nama kolom yang digunakan sebagai input model. Anda dapat mengoper beberapa kolom.
provider
String
Tidak
Nama penyedia. Jika tidak ditentukan, penyedia default digunakan, atau satu-satunya penyedia yang terdaftar jika hanya ada satu.
model
String
Tidak
Nama model, misalnya,
"qwen3.6-plus".output_type
String / DataType
Tidak
Tipe output. Secara default,
output STRINGditambahkan. Jika Anda mengoper string tipe SQL atauDataTypenon-struct, satu kolom bernamaoutputditambahkan. Jika Anda mengoperDataType.struct({...}), kolom kustom ditambahkan.cache_table
String
Tidak
Nama tabel Fluss yang digunakan untuk menyimpan cache hasil prediksi.
cache_key
String / List[String]
Tidak
Kolom kunci cache. Saat Anda mengatur parameter ini, Anda juga harus mengatur
cache_table.config
Dict
Tidak
Opsi konfigurasi waktu proses.
**kwargs
key=value
Tidak
Mengganti parameter penyedia model untuk pemanggilan ini. Misalnya, saat menggunakan
OpenAICompatProvideratauDashScopeProvider, Anda dapat mengopercontent_type,system_prompt,user_prompt,temperature, dan sebagainya. -
Nilai kembalian
DataFrame dengan output model ditambahkan, secara default di kolom
output. -
Contoh
Pemanggilan teks
pf.set_model_provider(pf.OpenAICompatProvider(task="chat/completions")) questions = pf.from_dict({ "id": [1, 2], "question": ["What is Flink?", "What is stream processing?"], }) # kolom output default: output (STRING) df = questions.llm.predict("question", model="qwen3.6-plus") # kolom output kustom: answer (STRING) df = questions.llm.predict( "question", model="qwen3.6-plus", output_type=pf.DataType.struct({ "answer": pf.DataType.string() }))Pemanggilan multimodal
pf.set_model_provider(pf.OpenAICompatProvider(task="chat/completions")) tickets = pf.from_dict({ "question": ["Is this item damaged?"], "image_url": ["https://example.com/images/order-1001.jpg"], }) # kolom input multimodal: satu kolom teks dan satu kolom gambar df = tickets.llm.predict( "question", "image_url", model="qwen3.6-plus", content_type=["TEXT", "IMAGE_URL"], )Cache hasil
pf.set_model_provider(pf.OpenAICompatProvider(task="chat/completions")) df = questions.llm.predict( "question", model="qwen3.6-plus", cache_table="`fluss-catalog`.default_database.predict_cache", cache_key=["id", "question"])CatatanHanya Flink AI Service (model bawaan) yang mendukung pemanggilan multimodal dan cache hasil.
Teks
Klasifikasi teks
-
Nama API: ai_classify.
DataFrame.llm.ai_classify( input_col, labels, *, provider=None, model=None, cache_table=None, cache_key=None, config=None, **kwargs ) -
Deskripsi: Mengklasifikasikan teks ke salah satu label yang ditentukan.
-
Parameter
Nama parameter
Tipe parameter
Wajib
Deskripsi
input_col
String / Expression
Ya
Nama kolom teks input atau ekspresi kolom.
labels
List[String]
Ya
Daftar label klasifikasi, misalnya,
["positive", "negative", "neutral"].Lihat deskripsi parameter lain di Pemanggilan generik.
CatatanFungsi AI spesifik domain seperti
ai_classifymenggunakan system prompt bawaan. System prompt yang dikonfigurasi pada Model Provider tidak berlaku. -
Nilai kembalian
DataFrame dengan kolom
category(STRING) danconfidence(DOUBLE) ditambahkan, yang berisi hasil klasifikasi dan skor kepercayaan. -
Contoh
pf.set_model_provider(pf.OpenAICompatProvider(task="chat/completions")) df = pf.from_dict({"review": ["Great product", "Terrible, do not buy", "It is okay"]}) df = df.llm.ai_classify("review", labels=["positive", "negative", "neutral"], model="qwen3.6-plus")
Analisis sentimen
-
Nama API: ai_sentiment.
DataFrame.llm.ai_sentiment( input_col, *, provider=None, model=None, cache_table=None, cache_key=None, config=None, **kwargs ) -
Deskripsi: Melakukan analisis sentimen pada teks input.
-
Parameter
Nama parameter
Tipe parameter
Wajib
Deskripsi
input_col
String / Expression
Ya
Nama kolom teks input atau ekspresi kolom.
Lihat deskripsi parameter lain di Pemanggilan generik.
-
Nilai kembalian
DataFrame dengan kolom berikut ditambahkan, yang berisi hasil analisis sentimen:
-
score(DOUBLE): Skor analisis sentimen, berkisar dari -1,0 hingga 1,0. -
label(STRING): Salah satu dari "positive", "negative", atau "neutral". -
confidence(DOUBLE): Skor kepercayaan.
-
-
Contoh
pf.set_model_provider(pf.OpenAICompatProvider(task="chat/completions")) df = pf.from_dict({"comment": ["This feature is amazing!", "Broke after one month"]}) df = df.llm.ai_sentiment("comment", model="qwen3.6-plus")
Ekstraksi informasi
-
Nama API: ai_extract.
DataFrame.llm.ai_extract( input_col, schema, *, provider=None, model=None, cache_table=None, cache_key=None, config=None, **kwargs ) -
Deskripsi: Mengekstraksi informasi terstruktur dari teks berdasarkan skema JSON yang diberikan.
-
Parameter
Nama parameter
Tipe parameter
Wajib
Deskripsi
input_col
String / Expression
Ya
Nama kolom teks input atau ekspresi kolom.
schema
String
Ya
String skema JSON yang mendeskripsikan bidang yang akan diekstraksi, misalnya,
'{"name":"STRING", "phone":"STRING"}'.Lihat deskripsi parameter lain di Pemanggilan generik.
-
Nilai kembalian
DataFrame dengan kolom
extracted_json(STRING) ditambahkan, yang berisi informasi terstruktur yang diekstraksi. -
Contoh
pf.set_model_provider(pf.OpenAICompatProvider(task="chat/completions")) df = pf.from_dict({"text": ["John Smith, male, 28 years old, phone ***-****"]}) schema = '{"name": "STRING", "age": "INTEGER", "phone": "STRING"}' df = df.llm.ai_extract("text", schema=schema, model="qwen3.6-plus")
Terjemahan teks
-
Nama API: ai_translate.
DataFrame.llm.ai_translate( input_col, source_lang, target_lang, *, provider=None, model=None, cache_table=None, cache_key=None, config=None, **kwargs ) -
Deskripsi: Menerjemahkan teks dari bahasa sumber ke bahasa target.
-
Parameter
Nama parameter
Tipe parameter
Wajib
Deskripsi
input_col
String / Expression
Ya
Nama kolom teks input atau ekspresi kolom.
source_lang
String
Ya
Kode bahasa sumber, misalnya:
"zh","en","auto"(terdeteksi otomatis). Didukung:auto,zh,en,ja,ko,fr,de,es,ru,ar,pt.target_lang
String
Ya
Kode bahasa target. Nilai ini tidak boleh
"auto".Lihat deskripsi parameter lain di Pemanggilan generik.
-
Nilai kembalian
DataFrame dengan kolom
translated_text(STRING) dandetected_language(STRING) ditambahkan, yang berisi teks terjemahan dan bahasa yang terdeteksi. -
Contoh
pf.set_model_provider(pf.OpenAICompatProvider(task="chat/completions")) df = pf.from_dict({"text": ["Hello World", "How are you?"]}) df = df.llm.ai_translate("text", source_lang="en", target_lang="zh", model="qwen3.6-plus")
Ringkasan teks
-
Nama API: ai_summarize.
DataFrame.llm.ai_summarize( input_col, max_length, *, provider=None, model=None, cache_table=None, cache_key=None, config=None, **kwargs ) -
Deskripsi: Merangkum teks hingga panjang maksimum yang ditentukan.
-
Parameter
Nama parameter
Tipe parameter
Wajib
Deskripsi
input_col
String / Expression
Ya
Nama kolom teks input atau ekspresi kolom.
max_length
int
Ya
Jumlah maksimum karakter dalam ringkasan. Harus lebih besar dari 0.
Lihat deskripsi parameter lain di Pemanggilan generik.
-
Nilai kembalian
DataFrame dengan kolom
summary(STRING) ditambahkan, yang berisi teks ringkasan. -
Contoh
pf.set_model_provider(pf.OpenAICompatProvider(task="chat/completions")) df = pf.from_dict({"article": ["This is a long article with lots of content..."]}) df = df.llm.ai_summarize("article", max_length=100, model="qwen3.6-plus")
Penyembunyian data
-
Nama API: ai_mask.
DataFrame.llm.ai_mask( input_col, entities, *, provider=None, model=None, cache_table=None, cache_key=None, config=None, **kwargs ) -
Deskripsi: Menyembunyikan informasi sensitif dalam teks.
-
Parameter
Nama parameter
Tipe parameter
Wajib
Deskripsi
input_col
String / Expression
Ya
Nama kolom teks input atau ekspresi kolom.
entities
List[String]
Ya
Daftar tipe entitas yang akan disembunyikan, misalnya,
["name", "phone"].Lihat deskripsi parameter lain di Pemanggilan generik.
-
Nilai kembalian
DataFrame dengan kolom
masked_text(STRING) dandetected_entities(ARRAY<STRING>) ditambahkan, yang berisi teks yang telah disembunyikan dan entitas yang terdeteksi. -
Contoh
pf.set_model_provider(pf.OpenAICompatProvider(task="chat/completions")) df = pf.from_dict({"text": ["Please contact John Smith at 555-0123"]}) df = df.llm.ai_mask("text", entities=["name", "phone"], model="qwen3.6-plus")
Vektor
Pencarian vektor
-
Metode
vector_searchdidukung mulai dari VVR 11.8 dan versi setelahnya. -
Kemampuan proyeksi kolom hasil
output_columnsdan alias berbasis pemetaan yang dijelaskan dalam topik ini didukung mulai dari VVR 11.9 dan versi setelahnya. -
Di VVR 11.8,
output_columnshanya mengganti nama semua kolom output: dalam mode non-agregasi Anda harus memberikan nama sebanyak kolom tabel vektor ditambahscore, dan dalam mode agregasi Anda harus memberikan satu nama untuk kolom array luar. Setelah Anda meningkatkan ke VVR 11.9 atau versi setelahnya, sesuaikan parameter ini ke semantik proyeksi yang dijelaskan dalam topik ini.
-
Nama API: vector_search.
DataFrame.llm.vector_search( search_source, column_to_search, column_to_query, top_k, *, agg=False, output_columns=None, config=None, ignore_empty=False ) -
Deskripsi: Mencari sumber pencarian vektor untuk catatan paling mirip menggunakan vektor kueri di DataFrame saat ini, dan menambahkan hasil pencarian ke DataFrame saat ini.
-
Parameter
Nama parameter
Tipe parameter
Wajib
Deskripsi
search_source
DataFrame
Ya
DataFrame sumber pencarian vektor, misalnya, koleksi vektor yang dibaca menggunakan
read_milvus.column_to_search
String
Ya
Nama kolom vektor di sumber pencarian.
column_to_query
String / Expression
Ya
Nama kolom vektor kueri atau ekspresi kolom di DataFrame saat ini.
top_k
int
Ya
Jumlah catatan paling mirip yang dikembalikan per catatan input.
agg
Boolean
Tidak
Menentukan apakah hasil top K diagregasi ke dalam satu kolom array. Nilai default:
False.output_columns
List[String] / Mapping[String, String]
Tidak
Kolom hasil pencarian vektor yang akan dikembalikan. Daftar memilih kolom dan mempertahankan nama aslinya. Dengan
agg=FalseAnda juga dapat menggunakan pemetaan, di mana kunci memilih kolom dan nilai menjadi alias output. Anda dapat memilih kolom tingkat atassearch_sourcedan kolomscoreyang dihasilkan oleh engine. Nilai default:None, yang memilih semua kolom hasil.config
Dict
Tidak
Konfigurasi pencarian vektor waktu proses.
ignore_empty
Boolean
Tidak
Menentukan apakah baris input yang tidak memiliki hasil pencarian dihapus. Nilai default:
False. -
Nilai kembalian
Objek DataFrame yang berisi kolom asli dan kolom hasil pencarian vektor yang ditambahkan. Asumsikan bahwa
output_columnsmemilih total M kolom hasil:-
Jika Anda tidak menentukan output_columns, semua kolom
search_sourcedan kolom skor pencarian bertipeDOUBLEdikembalikan. Secara default kolom skor dinamaiscore. Makna dan arah pengurutan skor bergantung pada connector dan metrik jaraknya. Untuk Milvus, interpretasikan nilai tersebut bersama dengansearch_metric. -
Saat agg=False, setiap baris input menghasilkan paling banyak top_k baris output dengan M kolom ditambahkan. Daftar memilih kolom dalam urutan yang dideklarasikan dan mempertahankan nama aslinya. Pemetaan memilih kolom dalam urutan deklarasi kuncinya dan menggunakan nilai yang sesuai sebagai alias output.
-
Saat `agg=True`, setiap input yang memiliki hasil pencarian menghasilkan paling banyak satu baris output, dengan kolom
search_resultsbertipeARRAY<ROW<...>>ditambahkan. Secara defaultignore_empty=Falsemenyimpan semua catatan input, dansearch_resultsbernilaiNULLsaat input tidak memiliki hasil pencarian. Jika Anda mengaturignore_empty=True, input tanpa hasil pencarian tidak muncul dalam hasil. Setiap elemen array adalah ROW yang berisi M bidang yang dipilih. Mode ini hanya mendukung daftar untuk memproyeksikan bidang dalam, bukan pemetaan. Setelah pemanggilan, ganti nama kolom array luar dengan memanggil `rename_columns("search_results", "new_name")`. -
output_columns tidak boleh kosong, dan baik nama kolom maupun alias tidak boleh kosong atau duplikat. Kolom yang dipilih harus merupakan kolom tingkat atas search_source atau kolom kemiripan yang dihasilkan. Urutan yang dikembalikan sesuai dengan urutan deklarasi daftar atau kunci pemetaan.
-
Jika search_source sudah memiliki kolom seperti score atau score0, engine memilih nama unik untuk kolom kemiripan yang dihasilkan, seperti score2. Dalam kasus ini, gunakan nama kolom aktual di output_columns.
-
Dalam mode non-agregasi, Anda dapat menggunakan pemetaan untuk memberikan alias kolom hasil yang tidak bentrok. Jika daftar atau output default bentrok dengan kolom DataFrame saat ini, ganti nama kolom yang bentrok dengan rename_columns sebelum memanggil vector_search. Dalam mode agregasi, jika DataFrame saat ini sudah memiliki kolom search_results, ganti nama kolom tersebut terlebih dahulu.
-
Jika connector sumber pencarian vektor mendukung pushdown pemangkasan kolom, engine mendorong pemangkasan output_columns ke connector. Terlepas dari apakah pushdown didukung atau tidak, hasil akhir hanya berisi kolom hasil pencarian vektor yang dipilih.
-
-
Catatan tentang peningkatan dari VVR 11.8
Di VVR 11.8,
output_columnsberarti alias semua kolom output. Di VVR 11.9 dan versi setelahnya, artinya kolom hasil yang dipilih. Misalnya, pemanggilan berikut yang ditulis untuk VVR 11.8:output_columns=["match_doc_id", "match_embedding", "match_title", "match_score"]Setelah peningkatan, gunakan pemetaan sebagai gantinya:
output_columns={ "doc_id": "match_doc_id", "embedding": "match_embedding", "title": "match_title", "score": "match_score", } -
Contoh
from array import array import pyflink.dataframe as pf from pyflink.dataframe import DataType query_df = pf.from_dict({ "query_id": [1], "query_embedding": [array("f", [0.1, 0.2, 0.3])], }) documents = pf.read_milvus( endpoint="http://milvus.example.com", username="${secret_values.milvus_user}", password="${secret_values.milvus_password}", database_name="commerce", collection_name="support_docs", schema={ "doc_id": DataType.int64(), "embedding": DataType.list(DataType.float32()), "title": DataType.string(), }, search_metric="COSINE", ) selected_docs = query_df.llm.vector_search( documents, column_to_search="embedding", column_to_query="query_embedding", top_k=3, output_columns=["doc_id", "title", "score"], )Daftar memproyeksikan kolom hasil dan mempertahankan nama aslinya. Untuk menentukan alias sekaligus, gunakan pemetaan:
matched_docs = query_df.llm.vector_search( documents, column_to_search="embedding", column_to_query="query_embedding", top_k=3, output_columns={ "doc_id": "match_doc_id", "title": "match_title", "score": "match_score", }, )Dalam mode agregasi, daftar memilih bidang setiap elemen array, dan kolom array luar selalu dinamai
search_results. Untuk mengganti nama kolom array luar, panggilrename_columns:matched_docs_agg = query_df.llm.vector_search( documents, column_to_search="embedding", column_to_query="query_embedding", top_k=3, agg=True, output_columns=["doc_id", "title", "score"], ).rename_columns("search_results", "matches")
Embedding teks
-
Nama API: ai_embed.
DataFrame.llm.ai_embed( input_col, dimension=1024, *, provider=None, model=None, cache_table=None, cache_key=None, config=None, **kwargs ) -
Deskripsi: Menghasilkan embedding vektor untuk teks.
-
Parameter
Nama parameter
Tipe parameter
Wajib
Deskripsi
input_col
String / Expression
Ya
Nama kolom teks input atau ekspresi kolom.
dimension
int
Tidak
Dimensi vektor. Nilai default: 1024.
Lihat deskripsi parameter lain di Pemanggilan generik.
-
Nilai kembalian
DataFrame dengan kolom
embedding(ARRAY<FLOAT>) ditambahkan, yang berisi vektor yang dihasilkan. -
Contoh
pf.set_model_provider("embedding", pf.OpenAICompatProvider(task="embeddings")) df = pf.from_dict({"text": ["stream processing with Flink", "real-time analytics"]}) df = df.llm.ai_embed("text", dimension=1024, provider="embedding", model="text-embedding-v4")
Operator multimodal
API DataFrame memungkinkan Anda memanggil operator multimodal untuk membaca, memproses, dan menganalisis data multimodal seperti gambar, audio, dan video. Untuk informasi lebih lanjut, lihat Operator Multimodal. Untuk dokumentasi API, lihat Ekspresi Multimodal.
Lingkungan dan konfigurasi
|
API |
Deskripsi |
|
Atur TableEnvironment global |
|
|
Ambil TableEnvironment saat ini |
|
|
Ambil atau buat otomatis TableEnvironment |
|
|
Atur opsi konfigurasi DataFrame |
|
|
Baca opsi konfigurasi DataFrame |
Ubah parameter waktu proses
-
Nama API: DataFrameConfig.set.
DataFrameConfig.set( key, value ) -
Deskripsi: Mengubah parameter waktu proses job API DataFrame. Anda dapat mengonfigurasi parameter job Python dan parameter API Tabel seperti yang ditunjukkan pada contoh berikut. Parameter yang dikonfigurasi berlaku untuk
TableEnvironmentdefault dan menggantikan parameter dengan nama yang sama di Runtime parameter configuration job. -
Parameter
Nama parameter
Tipe parameter
Wajib
Deskripsi
key
String
Ya
Nama parameter.
value
String
Ya
Nilai parameter.
-
Nilai kembalian
Objek DataFrameConfig itu sendiri, yang mendukung method chaining.
-
Contoh
import pyflink.dataframe as pf pf.config.set("python.fn-execution.arrow.batch.size", "256") pf.config.set("table.exec.async-scalar.max-concurrent-operations", "10") pf.config.set("table.exec.async-lookup.timeout", "1 min")CatatanKonfigurasikan parameter sebelum Anda mendefinisikan logika job untuk memastikan parameter tersebut berlaku sebagaimana mestinya.