Tüm Ürünler
Search
Belge Merkezi

Realtime Compute for Apache Flink:Python DataFrame API 参考

Son Güncelleme:Oct 04, 2026

Python DataFrame API, Flink işleri yazmak için DataFrame tarzında bir Python arayüzü sağlar. Veri işleme mantığını ilişkisel cebir stilinde ifade etmenizi sağlayan filtreleme, projeksiyon, birleştirme ve toplama gibi temel API'ler sunar. Ayrıca DataFrame API, standart operatörlerin ifade edemediği iş mantığını kapsayacak şekilde Python'da kullanıcı tanımlı işlevler yazmanıza olanak tanır. Buna ek olarak, DataFrame API, sınıflandırma, duygu analizi, ayıklama, çeviri, özetleme ve gömme için hazır AI işlevleriyle doğrudan veri işlem hattınızda büyük dil modellerine bağlanan yapay zeka/büyük dil modeli (AI/LLM) yetenekleri sağlar. Bu konu, iş geliştirme için referans olarak desteklenen API'leri açıklar. Tam API belgeleri için bkz. PyFlink DataFrame.

DataFrame işlemleri

Aşağıdaki tabloda, DataFrame üzerindeki temel işlemler özetlenmiştir.


Kategori


API'ler


Oluşturma / oluşturma


from_table, from_pandas, from_arrow, from_dict, from_records, range


Nitelikler


schema, columns


Projeksiyon / sütun işlemleri


select, with_column, with_columns, drop_columns, rename_columns


Filtreleme


filter


Toplama


group_by, agg


Birleştirme / küme birleşimi


join, join_asof, join_lateral


Satır eşleme


map, map_batches, flat_map


Açma (Explode)


explode


Tekilleştirme


drop_duplicates


Küme işlemleri


union, union_all, minus, minus_all, intersect, intersect_all


Sınırlandırma / sayfalama


limit, offset, head


Bölümleme


rebalance


Pipe


pipe


Null değeri işleme


drop_null, drop_nan, fill_null, fill_nan


Çıktı / toplama


to_table, to_pandas, collect, iter_rows, iter_batches


Hata ayıklama / yürütme planı


explain


SQL


sql

İfade yardımcı işlevleri


İşlev


Açıklama


col


Bir sütun başvuru ifadesi oluşturur.


lit


Bir sabit değer ifadesi oluşturur.

Veri türü

DataType , DataFrame sütun türlerini tanımlamak için kullanılır.


Tür kategorisi


Yöntemler


Boole


DataType.bool


Tamsayı


DataType.int8, DataType.int16, DataType.int32, DataType.int64


Kayan nokta / sabit nokta


DataType.float32, DataType.float64, DataType.decimal


Dize


DataType.string, DataType.fixed_size_string


İkili


DataType.binary, DataType.fixed_size_binary


Tarih / saat


DataType.date, DataType.time, DataType.timestamp, DataType.timestamp_ltz


Bileşik


DataType.list, DataType.map, DataType.struct


Özel


DataType.null, DataType.variant


Çok modlu


DataType.tensor, DataType.image


Nullability değiştiricisi


DataType.not_null, DataType.nullable

DataType, bir veri kaynağının şemasını, bir UDF'nin çıkış türünü vb. belirtmek için kullanılabilir. Örneğin, bir Kafka kaynağının şemasını belirtmek için DataType'ı kullanın:

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, değişken şekilli tensörleri destekler. Bir UDF'de, değişken şekilli tensörler ile NumPy ndarrays arasında dönüşüm yapmak için yerleşik yöntemleri kullanabilirsiniz:

from pyflink.dataframe.tensor import variable_tensors_to_arrow

result_type = DataType.struct({
    "id": DataType.int64(),
    # No shape specified: a variable-length tensor
    "tensor": DataType.tensor("float32"),
})

def transpose_batch_tensor(batch):
    # Call to_numpy() to convert the variable-length tensor columns to object ndarrays.
    # Each element is a standalone ndarray, and the shapes can differ.
    tensors = batch["tensor"].to_numpy()

    transposed = [
        None if tensor is None else tensor.T
        for tensor in tensors
    ]

    return {
        "id": batch["id"],
        # Convert the variable-length ndarray columns back to Arrow variable-length tensor columns
        "tensor": variable_tensors_to_arrow(
            transposed,
            dtype="float32",
        ),
    }
Not

Değişken şekilli tensörler VVR 11.9.preview.1 sürümünden itibaren desteklenmektedir.

G/Ç

DataFrame, yaygın veri kaynaklarını okumak ve yazmak için zengin bir G/Ç API kümesi sağlar. Veri okuma ve yazma işlemleri için diğer desteklenen connectors veya custom connectors ile çalışmak üzere read_generic veya write_generic fonksiyonlarını da kullanabilirsiniz.

Veri okuma


Kaynak


API


Parquet dosyası


read_parquet


JSON dosyası


read_json


Kafka


read_kafka


MaxCompute (ODPS)


read_odps


Paimon


read_paimon


SLS (Simple Log Service)


read_sls


Hologres


read_hologres


Milvus


read_milvus


Video karesi


read_video_frames


Genel / özel bağlayıcılar


read_generic

Veri yazma

Sink

API

Parquet dosyası

write_parquet

JSON dosyası

write_json

Kafka

write_kafka

MaxCompute (ODPS)

write_odps

Paimon

write_paimon

SLS (Simple Log Service)

write_sls

Hologres

write_hologres

Milvus

write_milvus

Yazdırma

write_print

VVR 11.9.preview.1 sürümünden itibaren desteklenir.

Genel / özel bağlayıcılar

write_generic

Tek bir işin verileri birden çok kez yazması gerektiğinde, tüm yazma fonksiyonlarını birlikte çalıştırmak için create_statement_set kullanarak bir StatementSet oluşturun.

Catalog Kullanımı

DataFrame API, Catalog'ları kullanabilir ve Catalog tablolarından veri okuyup bu tablolara veri yazabilir.


API


Açıklama


create_catalog


Catalog oluşturur


get_catalog


Kayıtlı bir Catalog nesnesini alır


use_catalog


Geçerli Catalog'u değiştirir


get_current_catalog


Geçerli Catalog'u alır


list_catalogs


Catalog'ları listeler


use_database


Geçerli veritabanını değiştirir


get_current_database


Geçerli veritabanını alır


list_databases


Geçerli Catalog'daki veritabanlarını listeler


read_catalog_table


Bir Catalog tablosunu DataFrame olarak okur


write_catalog_table


Bir DataFrame'i bir Catalog tablosuna yazar

Kullanıcı tanımlı fonksiyonlar

Kullanıcı tanımlı skaler fonksiyonlar udf

Kullanıcı tanımlı bir skaler fonksiyon, her girdi satırını tek bir sonuç değerine dönüştürür. Dört türden biri olabilir:

  • Senkron satır UDF: Bir seferde bir satırı işleyen normal bir Python fonksiyonu.

  • Asenkron satır UDF: Harici hizmetleri çağırma veya G/Ç yoğunluklu mantık için uygundur; aktarım hızını artırmak amacıyla birden çok satırın eş zamanlı olarak G/Ç işlemi yapmasına olanak tanır.

  • Senkron vektör UDF: Verileri toplu halde alır ve döndürür; Python ile Flink çalışma zamanı arasındaki satır başına ek yükü azaltır. Saf hesaplama işlemleri için uygundur.

  • Asenkron vektör UDF: Toplu iş aktarım hızını asenkron G/Ç eşzamanlılığı ile birleştirir.

Skaler fonksiyonları kaydetme

udf dekoratörü, bir Python fonksiyonunu DataFrames içinde kullanılmak üzere skaler bir fonksiyon olarak kaydeder.

  • API adı: 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
    )
  • Açıklama: Bir Python fonksiyonunu DataFrame skaler UDF olarak kaydeder. Normal fonksiyonları, asenkron fonksiyonları, ScalarFunction / AsyncScalarFunction alt sınıflarını ve çağrılabilir sınıfları destekler.

  • Parametreler


    Parametre adı


    Parametre türü


    Zorunlu


    Açıklama


    func


    Callable / Sınıf


    Hayır


    Sarmalanacak Python fonksiyonu, ScalarFunction örneği/alt sınıfı veya çağrılabilir sınıf. Atlanırsa bir dekoratör döndürülür.


    return_dtype


    DataType / str / type


    Hayır


    Dönüş türü. DataType örneği (örneğin, DataType.int64()), Python türleri (örneğin, int) veya SQL türü dizeleri (örneğin, 'BIGINT') olabilir. Atlanırsa, fonksiyon türü ipuçlarından otomatik olarak çıkarılır.


    deterministic


    Boolean


    Hayır


    Fonksiyonun deterministik olup olmadığı. Varsayılan: True.


    name


    Dize


    Hayır


    UDF adı. Varsayılan olarak fonksiyon adını alır.


    func_type


    Dize


    Hayır


    Çalıştırma formatı. Seçenekler: "general", "pandas", "arrow". Atlanırsa, fonksiyon türü ipuçlarından otomatik olarak algılanır.


    concurrency


    int


    Hayır


    UDF operatörünün paralellik değeri. Farklı eşzamanlılık değerlerine sahip UDF'ler ayrı operatörlere ayrılır.


    batch_size


    int


    Hayır


    Toplu iş başına maksimum öğe sayısı. Yalnızca toplu iş UDF'leri (pandas / arrow modu) için geçerlidir.


    num_gpus


    float


    Hayır


    UDF için istenecek GPU sayısı (örneğin, 0,5, 1). Ayarlandığında, UDF ayrı bir operatörde çalışır ve diğer UDF'lerle (diğer GPU UDF'leri dahil) zincirlenmez.


    gpu_type


    Dize


    Hayır


    GPU türü. num_gpus belirtildiğinde gereklidir.

  • Dönüş değeri

    with_column, with_columns, map, map_batches ve benzeri işlemlerde kullanılabilecek bir DataFrameUDFWrapper nesnesi.

Senkron satır UDF

**with_column veya with_columns içinde kullanım**

Bir skaler UDF, bir veya daha fazla sütun alır ve tek bir sütun döndürür. Dönüş türünü otomatik olarak çıkarmak için Python türü ipuçlarını kullanın veya açıkça belirtmek için return_dtype parametresini kullanın. Bir UDF tanımlarken, eşzamanlılığı ayarlamak için concurrency parametresini kullanabilirsiniz.

VVR 11.9.preview.1 sürümünden itibaren, çağrılabilir bir sınıf kullanarak bir UDF tanımlayabilirsiniz. UDF başlatma ve yürütme mantığını __init__ ve __call__ yöntemlerinde tanımlayın.

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:
    """Takes multiple columns as input"""
    if status == "PAID" and amount is not None and amount >= 100:
        return "high_value_paid"
    return "normal"

@udf
class ModelPredictor:
    def __init__(self):
        # Initialization is executed on the task manager
        self._model = load_model()

    def __call__(self, amount: float) -> str:
        return self._model.predict(amount)

# with_column adds a single column
orders_with_status = orders.with_column(
    "status_norm", normalize_status(col("status"))
)

# with_columns adds multiple columns at once
orders_with_flags = orders.with_columns(
    status_norm=normalize_status(col("status")),
    tag=order_tag(col("amount"), col("status")),
)

# Use stateful UDFs
orders_with_predictions = orders.with_column(
    "prediction", ModelPredictor(col("amount"))
)
**map içinde kullanım**

map tam bir satır alır ve yeni bir satır döndürür. Girdi sütunlarına fonksiyon içinde ada göre erişilir. Dönüş türü, açıkça bildirmek için DataType.struct ile veya otomatik çıkarım için TypedDict dönüş türü ipuçları aracılığıyla bildirilebilir. udf dekoratörünü kullanmadan doğrudan map işlevine bir Python fonksiyonu geçirebilirsiniz.

Açıkça bildirmek için return_dtype kullanımı

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(),
    }),
)

Otomatik algılama için TypedDict kullanımı

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)

Senkron vektör UDF

**with_column veya with_columns içinde kullanım**

Vektörize UDF'ler, verileri toplu halde alır ve döndürerek Python ile Flink çalışma zamanı arasındaki satır başına ek yükü azaltır. Saf hesaplama işlemleri için uygundur. Pandas (pandas.Series) ve Arrow (pyarrow.Array) formatlarını destekler. UDF mantığınıza göre seçim yapın. Toplu iş boyutunu kontrol etmek için batch_size parametresini kullanın. UDF tarafından döndürülen satır sayısı, girdi satır sayısına eşit olmalıdır.

Pandas formatı

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")),
)
**map_batches içinde kullanım**

map_batches tüm satırlar üzerinde vektörize işlem gerçekleştirir. batch_format="pandas" olduğunda, fonksiyon girdisi ve çıktısı dict[str, pandas.Series] türündedir. batch_format="arrow" olduğunda, girdi ve çıktı dict[str, pyarrow.Array] türündedir. udf dekoratörüyle sarmalamadan doğrudan map_batches işlevine bir Python fonksiyonu geçirebilirsiniz.

Pandas formatı

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(),
        }
    ),
)

Asenkron satır UDF

Asenkron UDF'ler, birden çok satırın G/Ç işlemlerini eş zamanlı olarak gerçekleştirmesine olanak tanıyarak aktarım hızını artırır. Harici hizmetleri çağıran veya G/Ç yoğunluklu mantık içeren işlemler için uygundur. Asenkron satır tabanlı UDF'leri with_column, with_columns veya map içinde çağırabilirsiniz.

import asyncio

# Use in `with_column`
@udf(concurrency=32)
async def query_region(user_id: int) -> str:
    await asyncio.sleep(0.01)  # simulate async I/O
    return f"region_for_{user_id}"

orders_with_region = orders.with_column(
    "region", query_region(col("user_id")),
)

# Use in `map`
class OrderWithRegion(TypedDict):
    order_id: int
    region: str

async def enrich_order_region(row) -> OrderWithRegion:
    await asyncio.sleep(0.01)  # Mock async I/O
    return {
        "order_id": row["order_id"],
        "region": f"region_for_{row['user_id']}",
    }

orders_with_region = orders.map(enrich_order_region)

Asenkron vektör UDF

Asenkron vektörize UDF'ler, toplu işleme aktarım hızını asenkron G/Ç eşzamanlılığı ile birleştirir. Her bir toplu işin boyutunu kontrol etmek için batch_size parametresini kullanın. Asenkron vektörize UDF'leri with_column, with_columns veya map_batches içinde çağırabilirsiniz.

# Use in `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)  # simulate async API call
        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")),
)

# Use in `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)  # Simulate asynchronous I/O
        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(),
    }),
)
Not

map ve map_batches içinde asenkron UDF'lerin çağrılması VVR 11.9.preview.1 sürümünden itibaren desteklenir.

Kullanıcı tanımlı tablo fonksiyonları udtf

Kullanıcı tanımlı bir tablo fonksiyonu, tek bir girdi satırını herhangi bir sayıda çıktı satırına genişletir ve her çıktı satırı bir veya daha fazla sonuç sütunu içerebilir.

Tablo fonksiyonlarını kaydetme

udtf dekoratörü, bir Python fonksiyonunu DataFrames içinde kullanılmak üzere tablo fonksiyonu olarak kaydeder.

  • API adı: udtf.

    udtf(
        func=None,
        *,
        return_dtype=None,
        deterministic=True,
        name=None,
        concurrency=None,
        num_gpus=None,
        gpu_type=None
    )
  • Açıklama: Bir Python fonksiyonunu, TableFunction alt sınıfını/örneğini veya çağrılabilir bir sınıfı, DataFrames içinde kullanılmak üzere tablo fonksiyonu olarak kaydeder.

  • Parametreler


    Parametre adı


    Parametre türü


    Zorunlu


    Açıklama


    func


    Callable / Sınıf


    Hayır


    Sarmalanacak Python fonksiyonu, TableFunction örneği/alt sınıfı veya çağrılabilir sınıf. Atlanırsa bir dekoratör döndürülür.


    return_dtype


    DataType / str / type


    Hayır


    Her çıktı satırının türü. Çok sütunlu çıktılar için DataType.struct({...}) veya TypedDict kullanın.


    deterministic


    Boolean


    Hayır


    Fonksiyonun deterministik olup olmadığı. Varsayılan: True.


    name


    Dize


    Hayır


    UDTF adı. Varsayılan olarak fonksiyon adını alır.


    concurrency


    int


    Hayır


    UDTF operatörünün paralellik değeri.


    num_gpus


    float


    Hayır


    UDTF için istenecek GPU sayısı (örneğin, 0,5, 1). Ayarlandığında, UDTF ayrı bir operatörde çalışır ve diğer UDF'lerle (diğer GPU UDF'leri dahil) zincirlenmez.


    gpu_type


    Dize


    Hayır


    GPU türü. num_gpus belirtildiğinde gereklidir.

  • Dönüş değeri

    flat_map veya join_lateral içinde kullanılabilecek bir DataFrameUDTFWrapper nesnesi.

In join_lateral Used in

join_lateral appends UDTF results after the original input row. By default, input rows that produce no UDTF output are removed; you can set ignore_empty=False to keep input rows with no UDTF output.

from typing import Iterator, Tuple
from pyflink.dataframe import udtf

# Use type hint and .alias() to specify return types and column names
@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,
)

# Or use 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")),
)

In flat_map Used in

flat_map calls the UDTF on each row. The result contains only the UDTF output columns, and the original input columns are not preserved. You can pass a Python function directly to flat_map without wrapping it with the udtf decorator.

from typing import Any, Dict, Iterator, TypedDict

# Use type hint with TypedDict to specify return types and column names
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)

# Or use 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()}),
)

AI / LLM functions

DataFrame provides a set of built-in AI functions through the df.llm accessor. For the detailed API reference, see AI/LLM.

Provider configuration

Before using AI functions, register a model provider first.


API


Description


set_model_provider


Register a model provider.


set_default_model_provider


Set the default provider (for multi-provider scenarios).


list_model_providers


List registered providers.

Supported provider types:


Provider


Use cases


OpenAICompatProvider


OpenAI, DeepSeek, DashScope (Model Studio), and all OpenAI-compatible interfaces.


DashScopeProvider


Alibaba Cloud DashScope, which supports multimodal embedding.


TritonProvider


NVIDIA Triton Inference Server


GenericProvider


Uses the registered custom model provider.

set_model_provider

  • API name: set_model_provider.

    set_model_provider(
        name_or_provider,
        provider=None,
        **options
    )
  • Description: Registers a global Model Provider configuration. Three calling patterns are supported: pass a ModelProvider instance; pass a name plus a ModelProvider instance; or pass a name plus keyword arguments. Registered names must be unique. Registering a provider with an existing name raises ValueError.

  • Parameters


    Parameter name


    Parameter type


    Required


    Description


    name_or_provider


    ModelProvider / String


    Yes


    A ModelProvider instance, which is registered automatically under its provider identifier, or a custom name string.


    provider


    ModelProvider


    No


    A ModelProvider instance. Used only when the first argument is a name string.


    **options


    key=value


    No


    Provider configuration items. Used only when the first argument is a name string and no provider is passed. When the first argument is openai-compat, dashscope, or triton, the corresponding provider is created. Otherwise, a GenericProvider is created.

  • Return value

    None.

  • Example

    # Option 1: pass a ModelProvider instance directly
    pf.set_model_provider(pf.OpenAICompatProvider(task="chat/completions"))
    
    # Option 2: custom name + ModelProvider instance (register multiple)
    pf.set_model_provider("chat", pf.OpenAICompatProvider(task="chat/completions"))
    pf.set_model_provider("embedding", pf.OpenAICompatProvider(task="embeddings"))
    
    # Option 3: name + keyword arguments
    pf.set_model_provider("dashscope", task="chat/completions")

Generic invocation

  • API name: predict.

    DataFrame.llm.predict(
        *input_cols,
        provider=None,
        model=None,
        output_type=None,
        cache_table=None,
        cache_key=None,
        config=None,
        **kwargs
    )
  • Description: Performs generic model inference. Sends the specified input columns to the model and appends the model output columns to the DataFrame.

  • Parameters


    Parameter name


    Parameter type


    Required


    Description


    *input_cols


    String


    Yes


    The names of the columns used as model input. You can pass multiple columns.


    provider


    String


    No


    The provider name. If not specified, the default provider is used, or the only registered provider if just one is registered.


    model


    String


    No


    The model name, for example, "qwen3.6-plus".


    output_type


    String / DataType


    No


    The output type. By default, output STRING is appended. If you pass a SQL type string or a non-struct DataType, a single column named output is appended. If you pass DataType.struct({...}), custom columns are appended.


    cache_table


    String


    No


    The name of the Fluss table used to cache prediction results.


    cache_key


    String / List[String]


    No


    The cache key columns. When you set this parameter, you must also set cache_table.


    config


    Dict


    No


    The runtime configuration options.


    **kwargs


    key=value


    No


    Overrides model provider parameters for this call. For example, when using OpenAICompatProvider or DashScopeProvider, you can pass content_type, system_prompt, user_prompt, temperature, and so on.

  • Return value

    A DataFrame with the model output appended, in the output column by default.

  • Example

    Text invocation

    pf.set_model_provider(pf.OpenAICompatProvider(task="chat/completions"))
    
    questions = pf.from_dict({
        "id": [1, 2],
        "question": ["What is Flink?", "What is stream processing?"],
    })
    
    # default output column: output (STRING)
    df = questions.llm.predict("question", model="qwen3.6-plus")
    
    # custom output column: answer (STRING)
    df = questions.llm.predict(
        "question",
        model="qwen3.6-plus",
        output_type=pf.DataType.struct({
            "answer": pf.DataType.string()
        }))

    Multimodal invocation

    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"],
    })
    
    # multimodal input columns: one text column and one image column
    df = tickets.llm.predict(
        "question",
        "image_url",
        model="qwen3.6-plus",
        content_type=["TEXT", "IMAGE_URL"],
    )

    Result caching

    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"])
    Not

    Only Flink AI Service (built-in models) supports multimodal invocation and result caching.

Text

Text classification

  • API name: ai_classify.

    DataFrame.llm.ai_classify(
        input_col,
        labels,
        *,
        provider=None,
        model=None,
        cache_table=None,
        cache_key=None,
        config=None,
        **kwargs
    )
  • Description: Classifies text into one of the specified labels.

  • Parameters


    Parameter name


    Parameter type


    Required


    Description


    input_col


    String / Expression


    Yes


    The input text column name or a column expression.


    labels


    List[String]


    Yes


    A list of classification labels, for example, ["positive", "negative", "neutral"].

    See the descriptions of other parameters at Generic invocation.

    Not

    Domain-specific AI functions such as ai_classify use a built-in system prompt. The system prompt configured on the Model Provider does not take effect.

  • Return value

    A DataFrame with the category (STRING) and confidence (DOUBLE) columns appended, which contain the classification result and the confidence score.

  • Example

    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")

Sentiment analysis

  • API name: ai_sentiment.

    DataFrame.llm.ai_sentiment(
        input_col,
        *,
        provider=None,
        model=None,
        cache_table=None,
        cache_key=None,
        config=None,
        **kwargs
    )
  • Description: Performs sentiment analysis on the input text.

  • Parameters


    Parameter name


    Parameter type


    Required


    Description


    input_col


    String / Expression


    Yes


    The input text column name or a column expression.

    See the descriptions of other parameters at Generic invocation.

  • Return value

    A DataFrame with the following columns appended, which contain the sentiment analysis result:

    • score (DOUBLE): The sentiment analysis score, ranging from -1.0 to 1.0.

    • label (STRING): One of "positive", "negative", or "neutral".

    • confidence (DOUBLE): Confidence score.

  • Example

    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")

Information extraction

  • API name: ai_extract.

    DataFrame.llm.ai_extract(
        input_col,
        schema,
        *,
        provider=None,
        model=None,
        cache_table=None,
        cache_key=None,
        config=None,
        **kwargs
    )
    
  • Description: Extracts structured information from text based on a given JSON Schema.

  • Parameters


    Parameter name


    Parameter type


    Required


    Description


    input_col


    String / Expression


    Yes


    The input text column name or a column expression.


    schema


    String


    Yes


    A JSON Schema string that describes the fields to extract, for example, '{"name":"STRING", "phone":"STRING"}'.

    See the descriptions of other parameters at Generic invocation.

  • Return value

    A DataFrame with the extracted_json (STRING) column appended, which contains the extracted structured information.

  • Example

    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")

Text translation

  • API name: 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
    )
  • Description: Translates text from a source language to a target language.

  • Parameters


    Parameter name


    Parameter type


    Required


    Description


    input_col


    String / Expression


    Yes


    The input text column name or a column expression.


    source_lang


    String


    Yes


    Source language code, for example: "zh", "en", "auto" (auto-detected). Supported: auto, zh, en, ja, ko, fr, de, es, ru, ar, pt.


    target_lang


    String


    Yes


    The target language code. This value cannot be "auto".

    See the descriptions of other parameters at Generic invocation.

  • Return value

    A DataFrame with the translated_text (STRING) and detected_language (STRING) columns appended, which contain the translated text and the detected language.

  • Example

    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")

Text summarization

  • API name: ai_summarize.

    DataFrame.llm.ai_summarize(
        input_col,
        max_length,
        *,
        provider=None,
        model=None,
        cache_table=None,
        cache_key=None,
        config=None,
        **kwargs
    )
    
  • Description: Summarizes text to a specified maximum length.

  • Parameters


    Parameter name


    Parameter type


    Required


    Description


    input_col


    String / Expression


    Yes


    The input text column name or a column expression.


    max_length


    int


    Yes


    Maximum number of characters in the summary. Must be greater than 0.

    See the descriptions of other parameters at Generic invocation.

  • Return value

    A DataFrame with the summary (STRING) column appended, which contains the summary text.

  • Example

    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")
    

Data masking

  • API name: ai_mask.

    DataFrame.llm.ai_mask(
        input_col,
        entities,
        *,
        provider=None,
        model=None,
        cache_table=None,
        cache_key=None,
        config=None,
        **kwargs
    )
    
  • Description: Masks sensitive information in text.

  • Parameters


    Parameter name


    Parameter type


    Required


    Description


    input_col


    String / Expression


    Yes


    The input text column name or a column expression.


    entities


    List[String]


    Yes


    A list of entity types to mask, for example, ["name", "phone"].

    See the descriptions of other parameters at Generic invocation.

  • Return value

    A DataFrame with the masked_text (STRING) and detected_entities (ARRAY<STRING>) columns appended, which contain the masked text and the detected entities.

  • Example

    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")

Vektör

Vektör araması

Not
  • vector_search yöntemi VVR 11.8 ve sonraki sürümlerde desteklenir.

  • Bu konuda açıklanan output_columns sonuç sütunu projeksiyonu ve eşleme tabanlı takma ad özellikleri VVR 11.9 ve sonraki sürümlerde desteklenir.

  • VVR 11.8'de output_columns yalnızca tüm çıktı sütunlarını yeniden adlandırır: toplu işlem olmayan modda vektör tablosunun sütun sayısı artı score kadar isim sağlamanız, toplu işlem modunda ise dış dizi sütunu için bir isim belirtmeniz gerekir. VVR 11.9 veya sonraki bir sürüme yükselttikten sonra bu parametreyi bu konuda açıklanan projeksiyon anlamına göre ayarlayın.

  • API adı: 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
    )
  • Açıklama: Mevcut DataFrame'deki sorgu vektörlerini kullanarak vektör arama kaynağında en benzer kayıtları arar ve arama sonuçlarını mevcut DataFrame'e ekler.

  • Parametreler


    Parametre adı


    Parametre türü


    Zorunlu


    Açıklama


    search_source


    DataFrame


    Evet


    Vektör arama kaynağı DataFrame'i; örneğin, read_milvus kullanılarak okunan bir vektör koleksiyonu.


    column_to_search


    Dize


    Evet


    Arama kaynağındaki vektör sütununun adı.


    column_to_query


    Dize / İfade


    Evet


    Mevcut DataFrame'deki sorgu vektörü sütun adı veya sütun ifadesi.


    top_k


    int


    Evet


    Giriş başına döndürülen en benzer kayıt sayısı.


    agg


    Boolean


    Hayır


    En iyi K sonucun tek bir dizi sütununda toplanıp toplanmayacağını belirtir. Varsayılan değer: False.


    output_columns


    List[Dize] / Eşleme[Dize, Dize]


    Hayır


    Döndürülecek vektör arama sonucu sütunları. Bir liste sütunları seçer ve orijinal adlarını korur. agg=False iken ayrıca anahtarların sütunları seçtiği ve değerlerin çıktı takma adları olduğu bir eşleme kullanabilirsiniz. search_source üst düzey sütunlarını ve motor tarafından oluşturulan score sütununu seçebilirsiniz. Varsayılan değer: None (tüm sonuç sütunlarını seçer).


    config


    Sözlük


    Hayır


    Çalışma zamanı vektör arama yapılandırması.


    ignore_empty


    Boolean


    Hayır


    Arama sonucu bulunmayan giriş satırlarının atılıp atılmayacağını belirtir. Varsayılan değer: False.

  • Dönüş değeri

    Orijinal sütunları ve eklenen vektör arama sonucu sütunlarını içeren bir DataFrame nesnesi. output_columns toplamda M sonuç sütunu seçiyorsa:

    • output_columns belirtmezseniz, search_source içindeki tüm sütunlar ve DOUBLE türünde bir arama puanı sütunu döndürülür. Puan sütunu varsayılan olarak score olarak adlandırılır. Puanın anlamı ve sıralama yönü bağlayıcıya ve uzaklık metriğine bağlıdır. Milvus için değeri search_metric ile birlikte değerlendirin.

    • agg=False olduğunda her giriş satırı en fazla top_k adet çıktı satırı üretir ve M sütun eklenir. Bir liste sütunları bildirilen sırayla seçer ve orijinal adlarını korur. Bir eşleme ise anahtarlarının bildirim sırasına göre sütunları seçer ve karşılık gelen değerleri çıktı takma adları olarak kullanır.

    • agg=True olduğunda arama sonucu bulunan her giriş en fazla bir çıktı satırı üretir ve search_results adlı ARRAY<ROW<...>> türünde bir sütun eklenir. Varsayılan olarak ignore_empty=False tüm giriş kayıtlarını korur ve bir girdinin arama sonucu yoksa search_results değeri NULL olur. ignore_empty=True ayarlarsanız arama sonucu olmayan girdiler sonuçta yer almaz. Her dizi öğesi, seçilen M alanı içeren bir ROW yapısıdır. Bu mod yalnızca iç alanları projekte etmek için bir listeyi destekler, eşlemeyi desteklemez. Çağrıdan sonra dış dizi sütununu yeniden adlandırmak için rename_columns("search_results", "new_name") çağrısını kullanın.

    • output_columns boş olamaz; sütun adları veya takma adlar da boş bırakılamaz veya yinelenemez. Seçilen sütunlar search_source üst düzey sütunları veya oluşturulan benzerlik sütunu olmalıdır. Dönüş sırası listenin veya eşleme anahtarlarının bildirim sırasına uyar.

    • search_source zaten score veya score0 gibi sütunlara sahipse motor oluşturulan benzerlik sütunu için score2 gibi benzersiz bir ad seçer. Bu durumda output_columns içinde gerçek sütun adını kullanın.

    • Toplu işlem olmayan modda sonuç sütunlarına çakışmayan takma adlar vermek için eşleme kullanabilirsiniz. Bir liste veya varsayılan çıktı mevcut DataFrame'in sütunlarıyla çakışıyorsa vector_search çağrısından önce çakışan sütunları rename_columns ile yeniden adlandırın. Toplu işlem modunda mevcut DataFrame'de zaten bir search_results sütunu varsa önce bu sütunu yeniden adlandırın.

    • Vektör arama kaynağının bağlayıcısı sütun budama itme desteğine sahipse motor output_columns budağını bağlayıcıya iter. İtme desteği olup olmadığından bağımsız olarak nihai sonuç yalnızca seçilen vektör arama sonucu sütunlarını içerir.

  • VVR 11.8'den yükseltme notları

    VVR 11.8'de output_columns tüm çıktı sütunlarının takma adını ifade eder. VVR 11.9 ve sonraki sürümlerde ise seçilecek sonuç sütunlarını ifade eder. Örneğin, VVR 11.8 için yazılan aşağıdaki çağrı:

    output_columns=["match_doc_id", "match_embedding", "match_title", "match_score"]

    Yükseltmeden sonra bunun yerine bir eşleme kullanın:

    output_columns={
        "doc_id": "match_doc_id",
        "embedding": "match_embedding",
        "title": "match_title",
        "score": "match_score",
    }
  • Örnekler

    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"],
    )

    Bir liste sonuç sütunlarını projekte eder ve orijinal adlarını korur. Aynı anda takma ad belirtmek için bir eşleme kullanın:

    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",
        },
    )

    Toplu işlem modunda bir liste her dizi öğesinin alanlarını seçer ve dış dizi sütunu her zaman search_results olarak adlandırılır. Dış dizi sütununu yeniden adlandırmak için rename_columns çağrısını kullanın:

    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")

Metin gömme

  • API adı: ai_embed.

    DataFrame.llm.ai_embed(
        input_col,
        dimension=1024,
        *,
        provider=None,
        model=None,
        cache_table=None,
        cache_key=None,
        config=None,
        **kwargs
    )
    
  • Açıklama: Metin için vektör gömmeleri oluşturur.

  • Parametreler


    Parametre adı


    Parametre türü


    Zorunlu


    Açıklama


    input_col


    Dize / İfade


    Evet


    Giriş metni sütun adı veya bir sütun ifadesi.


    dimension


    int


    Hayır


    Vektör boyutu. Varsayılan değer: 1024.

    Diğer parametrelerin açıklamaları için bkz. Genel çağrı.

  • Dönüş değeri

    Oluşturulan vektörü içeren embedding (ARRAY<FLOAT>) sütunu eklenmiş bir DataFrame.

  • Örnek

    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")

Çok modlu işleçler

DataFrame API'si, görüntüler, ses ve video gibi çok modlu verileri okumak, işlemek ve analiz etmek için çok modlu işleçleri çağırmanıza olanak tanır. Daha fazla bilgi için bkz. Çok Modlu İşleçler. API belgelendirmesi için bkz. Çok Modlu İfadeler.

Ortam ve yapılandırma


API


Açıklama


set_table_environment


Genel TableEnvironment'ı ayarlar


get_table_environment


Mevcut TableEnvironment'ı alır


get_or_create_table_environment


Bir TableEnvironment alır veya otomatik olarak oluşturur


config.set(key, value)


Bir DataFrame yapılandırma seçeneği ayarlar


config.get(key)


Bir DataFrame yapılandırma seçeneğini okur

Çalışma zamanı parametrelerini değiştirin

  • API adı: DataFrameConfig.set.

    DataFrameConfig.set(
        key, value
    )
  • Açıklama: Bir DataFrame API işinin çalışma zamanı parametrelerini değiştirir. Aşağıdaki örnekte gösterildiği gibi Python iş parametrelerini ve Table API parametrelerini yapılandırabilirsiniz. Yapılandırılan parametreler varsayılan TableEnvironment için geçerli olur ve işin Runtime parameter configuration bölümündeki aynı ada sahip parametreleri geçersiz kılar.

  • Parametreler


    Parametre adı


    Parametre türü


    Zorunlu


    Açıklama


    key


    Dize


    Evet


    Parametre adı.


    value


    Dize


    Evet


    Parametre değeri.

  • Dönüş değeri

    Yöntem zincirlemeyi destekleyen DataFrameConfig nesnesinin kendisi.

  • Örnek

    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")
    Not

    Beklenen şekilde etkili olmaları için parametreleri iş mantığını tanımlamadan önce yapılandırın.