Tous les produits
Search
Centre de documentation

Realtime Compute for Apache Flink:Python DataFrame API 参考

Dernière mise à jour :Sep 29, 2026

L'API Python DataFrame offre une interface Python de type DataFrame pour la rédaction de jobs Flink. Elle met à disposition des API fondamentales telles que filter, project, join et aggregate, vous permettant d'exprimer la logique de traitement des données selon le style de l'algèbre relationnelle. L'API DataFrame vous permet également d'écrire des fonctions définies par l'utilisateur en Python afin de couvrir la logique métier que les opérateurs standard ne peuvent pas exprimer. Par ailleurs, l'API DataFrame intègre des fonctionnalités d'IA/LLM qui se connectent directement aux grands modèles de langage au sein de votre pipeline de données, avec des fonctions d'IA prêtes à l'emploi pour la classification, l'analyse des sentiments, l'extraction, la traduction, la synthèse et l'embedding. Cette rubrique décrit les API prises en charge et sert de référence pour le développement de jobs. Pour consulter la documentation complète de l'API, reportez-vous à PyFlink DataFrame.

Opérations sur les DataFrames

Le tableau suivant récapitule les opérations principales disponibles pour le DataFrame.

Catégorie

APIs

Construction / création

from_table, from_pandas, from_arrow, from_dict, from_records, range

Attributs

schema, columns

Projection / opérations sur les colonnes

select, with_column, with_columns, drop_columns, rename_columns

Filtrage

filter

Agrégation

group_by, agg

Jointure / union

join, join_asof, join_lateral

<!--@p {"id":"d7474bf759n8o"}--br>Mapping des lignes

map, map_batches, flat_map

Explosion (Explode)

explode

Déduplication

drop_duplicates

Opérations ensemblistes

union, union_all, minus, minus_all, intersect, intersect_all

Limitation / pagination

limit, offset, head

Partitionnement

rebalance

Pipe

pipe

Gestion des valeurs nulles

drop_null, drop_nan, fill_null, fill_nan

Sortie / collecte

to_table, to_pandas, collect, iter_rows, iter_batches

Débogage / plan d'exécution

explain

SQL

sql

Fonctions utilitaires pour les expressions

Fonction

Description

col

Crée une expression de référence de colonne.

lit

Crée une expression littérale.

Type de données

Le type DataType sert à décrire les types des colonnes d'un DataFrame.

Catégorie de type

Méthodes

Booléen

DataType.bool

Entier

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

Flottant / décimal

DataType.float32, DataType.float64, DataType.decimal

Chaîne

DataType.string, DataType.fixed_size_string

Binaire

DataType.binary, DataType.fixed_size_binary

Date / heure

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

Composé

DataType.list, DataType.map, DataType.struct

Spécial

DataType.null, DataType.variant

Multimodal

DataType.tensor, DataType.image

Modificateur de nullabilité

DataType.not_null, DataType.nullable

Vous pouvez utiliser DataType pour spécifier le schéma d'une source de données, le type de sortie d'une UDF, etc. Par exemple, utilisez DataType pour définir le schéma d'une source 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 prend en charge les tenseurs de forme variable. Dans une UDF, vous pouvez utiliser les méthodes intégrées pour convertir les tenseurs de forme variable en tableaux NumPy ndarrays et inversement :

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

La prise en charge des tenseurs de forme variable est disponible à partir de VVR 11.9.preview.1.

I/O

DataFrame propose un ensemble complet d'API d'I/O pour la lecture et l'écriture des sources de données courantes. Vous pouvez également utiliser les fonctions read_generic ou write_generic pour interagir avec d'autres connecteurs pris en charge ou des connecteurs personnalisés afin de lire et d'écrire des données.

Lire des données

Source

API

Fichier Parquet

read_parquet

Fichier JSON

read_json

Kafka

read_kafka

MaxCompute (ODPS)

read_odps

Paimon

read_paimon

SLS (Simple Log Service)

read_sls

Hologres

read_hologres

Milvus

read_milvus

Image vidéo

read_video_frames

Connecteurs génériques/personnalisés

read_generic

Écrire des données

Sink

API

Fichier Parquet

write_parquet

Fichier JSON

write_json

Kafka

write_kafka

MaxCompute (ODPS)

write_odps

Paimon

write_paimon

SLS (Simple Log Service)

write_sls

Hologres

write_hologres

Milvus

write_milvus

Print

write_print

Prise en charge à partir de VVR 11.9.preview.1.

Connecteurs génériques/personnalisés

write_generic

Lorsqu'une tâche unique doit écrire des données plusieurs fois, utilisez create_statement_set pour créer un StatementSet et exécuter toutes les fonctions d'écriture conjointement.

Utiliser un Catalog

L'API DataFrame permet d'utiliser des Catalogs et de lire ou d'écrire dans des tables de Catalog.

API

Description

create_catalog

Crée un Catalog

get_catalog

Récupère un objet Catalog enregistré

use_catalog

Bascule vers le Catalog actuel

get_current_catalog

Récupère le Catalog actuel

list_catalogs

Liste les Catalogs

use_database

Bascule vers la base de données actuelle

get_current_database

Récupère la base de données actuelle

list_databases

Liste les bases de données du Catalog actuel

read_catalog_table

Lit une table de Catalog sous forme de DataFrame

write_catalog_table

Écrit un DataFrame dans une table de Catalog

Fonctions définies par l'utilisateur

Fonctions scalaires définies par l'utilisateur udf

Une fonction scalaire définie par l'utilisateur transforme chaque ligne d'entrée en une seule valeur de résultat. Elle peut appartenir à l'une des quatre catégories suivantes :

  • UDF de ligne synchrone : une fonction Python classique qui traite les lignes une par une.

  • UDF de ligne asynchrone : adaptée aux appels de services externes ou à la logique intensive en E/S ; permet à plusieurs lignes d'effectuer des E/S simultanément pour améliorer le débit.

  • UDF vectorielle synchrone : reçoit et renvoie les données par lots, réduisant ainsi la surcharge par ligne entre Python et le runtime Flink. Convient aux calculs purs.

  • UDF vectorielle asynchrone : combine le débit des traitements par lots avec la concurrence des E/S asynchrones.

Enregistrement des fonctions scalaires

Le décorateur udf enregistre une fonction Python en tant que fonction scalaire utilisable dans les DataFrames.

  • Nom de l'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
    )
  • Description : enregistre une fonction Python en tant qu'UDF scalaire pour DataFrame. Prend en charge les fonctions classiques, les fonctions asynchrones, les sous-classes ScalarFunction / AsyncScalarFunction et les classes appelables.

  • Paramètres

    Nom du paramètre

    Type de paramètre

    Obligatoire

    Description

    func

    Callable / Class

    Non

    Fonction Python, instance/sous-classe ScalarFunction ou classe callable à encapsuler. Si omis, un décorateur est renvoyé.

    return_dtype

    DataType / str / type

    Non

    Type de retour. Peut être une instance DataType (par exemple, DataType.int64()), des types Python (par exemple, int), ou des chaînes de type SQL (par exemple, 'BIGINT'). S'il est omis, il est déduit automatiquement des indications de type de la fonction.

    deterministic

    Boolean

    Non

    Indique si la fonction est déterministe. Valeur par défaut : True.

    name

    String

    Non

    Nom de l'UDF. Par défaut, le nom de la fonction est utilisé.

    func_type

    String

    Non

    Format d'exécution. Options : "general", "pandas", "arrow". S'il est omis, il est détecté automatiquement à partir des indications de type de la fonction.

    concurrency

    int

    Non

    Parallélisme de l'opérateur UDF. Les UDF ayant des valeurs de concurrence différentes sont divisées en opérateurs distincts.

    batch_size

    int

    Non

    Nombre maximal d'éléments par lot. S'applique uniquement aux UDF par lots (mode pandas / arrow).

    num_gpus

    float

    Non

    Nombre de GPU à allouer à l'UDF (par exemple, 0,5, 1). Lorsqu'il est défini, l'UDF s'exécute dans un opérateur distinct et n'est pas chaînée avec d'autres UDF (y compris d'autres UDF GPU).

    gpu_type

    String

    Non

    Type de GPU. Obligatoire lorsque num_gpus est spécifié.

  • Valeur de retour

    Un objet DataFrameUDFWrapper utilisable dans les opérations with_column, with_columns, map, map_batches et similaires.

UDF de ligne synchrone

Utilisation dans with_column ou with_columns

Une UDF scalaire prend une ou plusieurs colonnes en entrée et renvoie une seule colonne. Utilisez les indications de type Python pour déduire automatiquement le type de retour, ou utilisez return_dtype pour le spécifier explicitement. Lors de la définition d'une UDF, vous pouvez utiliser concurrency pour définir le niveau de concurrence.

À partir de VVR 11.9.preview.1, vous pouvez déclarer une UDF à l'aide d'une classe callable. Définissez la logique d'initialisation et d'exécution de l'UDF dans __init__ et __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:
    """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"))
)
Utilisation dans map

map prend une ligne complète et renvoie une nouvelle ligne. Les colonnes d'entrée sont accessibles par leur nom au sein de la fonction. Le type de retour peut être déclaré explicitement avec DataType.struct, ou déduit automatiquement via les indications de type de retour TypedDict. Vous pouvez passer directement une fonction Python à map sans utiliser udf comme décorateur.

Utilisation de return_dtype pour une déclaration explicite

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

Utilisation de TypedDict pour la détection automatique

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 vectorielle synchrone

Utilisation dans with_column ou with_columns

Les UDF vectorisées reçoivent et renvoient les données par lots, ce qui réduit la surcharge par ligne entre Python et le runtime Flink. Elles conviennent aux calculs purs. Elles prennent en charge les formats Pandas (pandas.Series) et Arrow (pyarrow.Array). Choisissez le format en fonction de la logique de votre UDF. Utilisez batch_size pour contrôler la taille des lots. Le nombre de lignes renvoyées par l'UDF doit être égal au nombre de lignes d'entrée.

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

Format Arrow

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")),
)
Utilisation dans map_batches

map_batches effectue un traitement vectorisé sur des lignes entières. Lorsque batch_format="pandas", l'entrée et la sortie de la fonction sont de type dict[str, pandas.Series]. Lorsque batch_format="arrow", l'entrée et la sortie sont de type dict[str, pyarrow.Array]. Vous pouvez passer directement une fonction Python à map_batches sans l'encapsuler avec le décorateur 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(),
        }
    ),
)

Format Arrow

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 de ligne asynchrone

Les UDF asynchrones permettent à plusieurs lignes d'effectuer des opérations d'E/S simultanément, ce qui améliore le débit. Elles conviennent aux logiques qui appellent des services externes ou qui sont intensives en E/S. Vous pouvez invoquer des UDF de ligne asynchrones dans with_column, with_columns ou map.

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)

UDF vectorielle asynchrone

Les UDF vectorisées asynchrones combinent le débit du traitement par lots avec la concurrence des E/S asynchrones. Utilisez batch_size pour contrôler la taille de chaque lot. Vous pouvez invoquer des UDF vectorisées asynchrones dans with_column, with_columns ou map_batches.

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

L'appel d'UDF asynchrones dans map et map_batches est pris en charge à partir de VVR 11.9.preview.1.

Fonctions de table définies par l'utilisateur udtf

Une fonction de table définie par l'utilisateur développe une ligne d'entrée en un nombre quelconque de lignes de sortie, chaque ligne de sortie pouvant contenir une ou plusieurs colonnes de résultat.

Enregistrement des fonctions de table

Le décorateur udtf enregistre une fonction Python en tant que fonction de table utilisable dans les DataFrames.

  • Nom de l'API : udtf.

    udtf(
        func=None,
        *,
        return_dtype=None,
        deterministic=True,
        name=None,
        concurrency=None,
        num_gpus=None,
        gpu_type=None
    )
  • Description : enregistre une fonction Python, une sous-classe ou instance de TableFunction, ou une classe callable en tant que fonction de table utilisable dans les DataFrames.

  • Paramètres

    Nom du paramètre

    Type de paramètre

    Obligatoire

    Description

    func

    Callable / Class

    Non

    Fonction Python, instance/sous-classe TableFunction ou classe callable à encapsuler. Si omis, un décorateur est renvoyé.

    return_dtype

    DataType / str / type

    Non

    Type de chaque ligne de sortie. Pour une sortie multicolonnes, utilisez DataType.struct({...}) ou TypedDict.

    deterministic

    Boolean

    Non

    Indique si la fonction est déterministe. Valeur par défaut : True.

    name

    String

    Non

    Nom de l'UDTF. Par défaut, le nom de la fonction est utilisé.

    concurrency

    int

    Non

    Parallélisme de l'opérateur UDTF.

    num_gpus

    float

    Non

    Nombre de GPU à allouer à l'UDTF (par exemple, 0,5, 1). Lorsqu'il est défini, l'UDTF s'exécute dans un opérateur distinct et n'est pas chaînée avec d'autres UDF (y compris d'autres UDF GPU).

    gpu_type

    String

    Non

    Type de GPU. Obligatoire lorsque num_gpus est spécifié.

  • Valeur de retour

    Un objet DataFrameUDTFWrapper utilisable dans flat_map ou join_lateral.

Utilisation dans join_lateral

join_lateral ajoute les résultats de l'UDTF après la ligne d'entrée d'origine. Par défaut, les lignes d'entrée qui ne produisent aucune sortie UDTF sont supprimées ; vous pouvez définir ignore_empty=False pour conserver les lignes d'entrée sans sortie UDTF.

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

Utilisation dans flat_map

flat_map appelle l'UDTF sur chaque ligne. Le résultat contient uniquement les colonnes de sortie de l'UDTF, et les colonnes d'entrée d'origine ne sont pas conservées. Vous pouvez passer directement une fonction Python à flat_map sans l'encapsuler avec le décorateur udtf.

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

Fonctions d'IA et LLM

DataFrame met à disposition un ensemble de fonctions d'IA intégrées via l'accesseur df.llm. Pour consulter la référence détaillée de l'API, rendez-vous sur la page IA/LLM.

Configuration du fournisseur

Avant d'utiliser les fonctions d'IA, vous devez d'abord enregistrer un fournisseur de modèles.

API

Description

set_model_provider

Enregistre un fournisseur de modèles.

set_default_model_provider

Définit le fournisseur par défaut (pour les scénarios impliquant plusieurs fournisseurs).

list_model_providers

Liste les fournisseurs enregistrés.

Types de fournisseurs pris en charge :

Fournisseur

Cas d'utilisation

OpenAICompatProvider

OpenAI, DeepSeek, DashScope (Model Studio) et toutes les interfaces compatibles avec OpenAI.

DashScopeProvider

Alibaba Cloud DashScope, qui prend en charge l'embedding multimodal.

TritonProvider

NVIDIA Triton Inference Server

GenericProvider

Utilise le fournisseur de modèles personnalisé enregistré.

set_model_provider

  • Nom de l'API : set_model_provider.

    set_model_provider(
        name_or_provider,
        provider=None,
        **options
    )
  • Description : Enregistre une configuration globale de fournisseur de modèles. Trois modes d'appel sont pris en charge : passer une instance ModelProvider ; passer un nom ainsi qu'une instance ModelProvider ; ou passer un nom accompagné d'arguments nommés. Les noms enregistrés doivent être uniques. L'enregistrement d'un fournisseur avec un nom déjà existant déclenche une exception ValueError.

  • Paramètres

    Nom du paramètre

    Type du paramètre

    Obligatoire

    Description

    name_or_provider

    ModelProvider / String

    Oui

    Une instance ModelProvider, qui est automatiquement enregistrée sous son identifiant de fournisseur, ou une chaîne de caractères représentant un nom personnalisé.

    provider

    ModelProvider

    Non

    Une instance ModelProvider. Utilisé uniquement lorsque le premier argument est une chaîne de caractères représentant un nom.

    **options

    key=value

    Non

    Éléments de configuration du fournisseur. Utilisé uniquement lorsque le premier argument est une chaîne de caractères représentant un nom et qu'aucun fournisseur n'est passé. Si le premier argument est openai-compat, dashscope ou triton, le fournisseur correspondant est créé. Dans le cas contraire, un GenericProvider est créé.

  • Valeur de retour

    Aucune.

  • Exemple

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

Appel générique

  • Nom de l'API : predict.

    DataFrame.llm.predict(
        *input_cols,
        provider=None,
        model=None,
        output_type=None,
        cache_table=None,
        cache_key=None,
        config=None,
        **kwargs
    )
  • Description : Effectue une inférence de modèle générique. Envoie les colonnes d'entrée spécifiées au modèle et ajoute les colonnes de sortie du modèle au DataFrame.

  • Paramètres

    Nom du paramètre

    Type du paramètre

    Obligatoire

    Description

    *input_cols

    String

    Oui

    Noms des colonnes utilisées comme entrée du modèle. Vous pouvez passer plusieurs colonnes.

    provider

    String

    Non

    Nom du fournisseur. Si non spécifié, le fournisseur par défaut est utilisé, ou l'unique fournisseur enregistré s'il n'y en a qu'un seul.

    model

    String

    Non

    Nom du modèle, par exemple "qwen3.6-plus".

    output_type

    String / DataType

    Non

    Type de sortie. Par défaut, output STRING est ajouté. Si vous passez une chaîne de type SQL ou un DataType non structuré, une seule colonne nommée output est ajoutée. Si vous passez DataType.struct({...}), des colonnes personnalisées sont ajoutées.

    cache_table

    String

    Non

    Nom de la table Fluss utilisée pour mettre en cache les résultats de prédiction.

    cache_key

    String / List[String]

    Non

    Colonnes de clé de cache. Lorsque vous définissez ce paramètre, vous devez également définir cache_table.

    config

    Dict

    Non

    Options de configuration d'exécution.

    **kwargs

    key=value

    Non

    Remplace les paramètres du fournisseur de modèles pour cet appel. Par exemple, lors de l'utilisation de OpenAICompatProvider ou de DashScopeProvider, vous pouvez passer content_type, system_prompt, user_prompt, temperature, etc.

  • Valeur de retour

    Un DataFrame auquel est ajoutée la sortie du modèle, dans la colonne output par défaut.

  • Exemple

    Appel textuel

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

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

    Mise en cache des résultats

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

    Seul le service Flink AI (modèles intégrés) prend en charge l'appel multimodal et la mise en cache des résultats.

Texte

Classification de texte

  • Nom de l'API : ai_classify.

    DataFrame.llm.ai_classify(
        input_col,
        labels,
        *,
        provider=None,
        model=None,
        cache_table=None,
        cache_key=None,
        config=None,
        **kwargs
    )
  • Description : Classe le texte dans l'une des étiquettes spécifiées.

  • Paramètres

    Nom du paramètre

    Type du paramètre

    Obligatoire

    Description

    input_col

    String / Expression

    Oui

    Nom de la colonne de texte d'entrée ou expression de colonne.

    labels

    List[String]

    Oui

    Liste d'étiquettes de classification, par exemple ["positive", "negative", "neutral"].

    Consultez les descriptions des autres paramètres dans la section Appel générique.

    Remarque

    Les fonctions d'IA spécifiques à un domaine, telles que ai_classify, utilisent un prompt système intégré. Le prompt système configuré sur le fournisseur de modèles n'est pas pris en compte.

  • Valeur de retour

    Un DataFrame auquel sont ajoutées les colonnes category (STRING) et confidence (DOUBLE), contenant respectivement le résultat de la classification et le score de confiance.

  • Exemple

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

Analyse des sentiments

  • Nom de l'API : ai_sentiment.

    DataFrame.llm.ai_sentiment(
        input_col,
        *,
        provider=None,
        model=None,
        cache_table=None,
        cache_key=None,
        config=None,
        **kwargs
    )
  • Description : Effectue une analyse des sentiments sur le texte d'entrée.

  • Paramètres

    Nom du paramètre

    Type du paramètre

    Obligatoire

    Description

    input_col

    String / Expression

    Oui

    Nom de la colonne de texte d'entrée ou expression de colonne.

    Consultez les descriptions des autres paramètres dans la section Appel générique.

  • Valeur de retour

    Un DataFrame auquel sont ajoutées les colonnes suivantes, contenant le résultat de l'analyse des sentiments :

    • score (DOUBLE) : Score d'analyse des sentiments, allant de -1,0 à 1,0.

    • label (STRING) : « positive », « negative » ou « neutral ».

    • confidence (DOUBLE) : Score de confiance.

  • Exemple

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

Extraction d'informations

  • Nom de l'API : ai_extract.

    DataFrame.llm.ai_extract(
        input_col,
        schema,
        *,
        provider=None,
        model=None,
        cache_table=None,
        cache_key=None,
        config=None,
        **kwargs
    )
    
  • Description : Extrait des informations structurées à partir d'un texte en se basant sur un schéma JSON donné.

  • Paramètres

    Nom du paramètre

    Type du paramètre

    Obligatoire

    Description

    input_col

    String / Expression

    Oui

    Nom de la colonne de texte d'entrée ou expression de colonne.

    schema

    String

    Oui

    Chaîne de schéma JSON décrivant les champs à extraire, par exemple '{"name":"STRING", "phone":"STRING"}'.

    Consultez les descriptions des autres paramètres dans la section Appel générique.

  • Valeur de retour

    Un DataFrame auquel est ajoutée la colonne extracted_json (STRING), contenant les informations structurées extraites.

  • Exemple

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

Traduction de texte

  • Nom de l'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
    )
  • Description : Traduit un texte d'une langue source vers une langue cible.

  • Paramètres

    Nom du paramètre

    Type du paramètre

    Obligatoire

    Description

    input_col

    String / Expression

    Oui

    Nom de la colonne de texte d'entrée ou expression de colonne.

    source_lang

    String

    Oui

    Code de la langue source, par exemple : "zh", "en", "auto" (détection automatique). Langues prises en charge : auto, zh, en, ja, ko, fr, de, es, ru, ar, pt.

    target_lang

    String

    Oui

    Code de la langue cible. Cette valeur ne peut pas être "auto".

    Consultez les descriptions des autres paramètres dans la section Appel générique.

  • Valeur de retour

    Un DataFrame auquel sont ajoutées les colonnes translated_text (STRING) et detected_language (STRING), contenant respectivement le texte traduit et la langue détectée.

  • Exemple

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

Résumé de texte

  • Nom de l'API : ai_summarize.

    DataFrame.llm.ai_summarize(
        input_col,
        max_length,
        *,
        provider=None,
        model=None,
        cache_table=None,
        cache_key=None,
        config=None,
        **kwargs
    )
    
  • Description : Résume un texte jusqu'à une longueur maximale spécifiée.

  • Paramètres

    Nom du paramètre

    Type du paramètre

    Obligatoire

    Description

    input_col

    String / Expression

    Oui

    Nom de la colonne de texte d'entrée ou expression de colonne.

    max_length

    int

    Oui

    Nombre maximal de caractères dans le résumé. Doit être supérieur à 0.

    Consultez les descriptions des autres paramètres dans la section Appel générique.

  • Valeur de retour

    Un DataFrame auquel est ajoutée la colonne summary (STRING), contenant le texte du résumé.

  • Exemple

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

Masquage de données

  • Nom de l'API : ai_mask.

    DataFrame.llm.ai_mask(
        input_col,
        entities,
        *,
        provider=None,
        model=None,
        cache_table=None,
        cache_key=None,
        config=None,
        **kwargs
    )
    
  • Description : Masque les informations sensibles dans un texte.

  • Paramètres

    Nom du paramètre

    Type du paramètre

    Obligatoire

    Description

    input_col

    String / Expression

    Oui

    Nom de la colonne de texte d'entrée ou expression de colonne.

    entities

    List[String]

    Oui

    Liste des types d'entités à masquer, par exemple ["name", "phone"].

    Consultez les descriptions des autres paramètres dans la section Appel générique.

  • Valeur de retour

    Un DataFrame auquel sont ajoutées les colonnes masked_text (STRING) et detected_entities (ARRAY<STRING>), contenant respectivement le texte masqué et les entités détectées.

  • Exemple

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

Vector

Recherche vectorielle

Remarque
  • La méthode vector_search est prise en charge à partir de VVR 11.8 et versions ultérieures.

  • Les fonctionnalités de projection des colonnes de résultat output_columns et d'alias basés sur le mapping, décrites dans cette rubrique, sont prises en charge à partir de VVR 11.9 et versions ultérieures.

  • Dans VVR 11.8, output_columns renomme uniquement toutes les colonnes de sortie : en mode sans agrégation, vous devez fournir autant de noms que de colonnes dans la table vectorielle, plus score ; en mode avec agrégation, vous devez fournir un nom pour la colonne de tableau externe. Après la mise à niveau vers VVR 11.9 ou version ultérieure, ajustez ce paramètre selon la sémantique de projection décrite dans cette rubrique.

  • Nom de l'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
    )
  • Description : Recherche les enregistrements les plus similaires dans la source de recherche vectorielle en utilisant les vecteurs de requête du DataFrame actuel, et ajoute les résultats de la recherche au DataFrame actuel.

  • Paramètres

    Nom du paramètre

    Type de paramètre

    Obligatoire

    Description

    search_source

    DataFrame

    Oui

    Le DataFrame source de recherche vectorielle, par exemple une collection vectorielle lue à l'aide de read_milvus.

    column_to_search

    String

    Oui

    Le nom de la colonne vectorielle dans la source de recherche.

    column_to_query

    String / Expression

    Oui

    Le nom de la colonne de vecteur de requête ou l'expression de colonne dans le DataFrame actuel.

    top_k

    int

    Oui

    Nombre d'enregistrements les plus similaires renvoyés par enregistrement d'entrée.

    agg

    Boolean

    Non

    Indique s'il faut agréger les K meilleurs résultats en une seule colonne de tableau. Valeur par défaut : False.

    output_columns

    List[String] / Mapping[String, String]

    Non

    Les colonnes de résultat de recherche vectorielle à renvoyer. Une liste sélectionne les colonnes et conserve leurs noms d'origine. Avec agg=False, vous pouvez également utiliser un mapping, où les clés sélectionnent les colonnes et les valeurs deviennent des alias de sortie. Vous pouvez sélectionner les colonnes de premier niveau de search_source et la colonne score générée par le moteur. Valeur par défaut : None, qui sélectionne toutes les colonnes de résultat.

    config

    Dict

    Non

    La configuration d'exécution de la recherche vectorielle.

    ignore_empty

    Boolean

    Non

    Indique s'il faut supprimer les lignes d'entrée qui n'ont aucun résultat de recherche. Valeur par défaut : False.

  • Valeur de retour

    Un objet DataFrame contenant les colonnes d'origine et les colonnes de résultat de recherche vectorielle ajoutées. Supposons que output_columns sélectionne M colonnes de résultat au total :

    • Si vous ne spécifiez pas output_columns, toutes les colonnes de search_source et une colonne de score de recherche de type DOUBLE sont renvoyées. Par défaut, la colonne de score est nommée score. La signification et l'ordre de tri du score dépendent du connecteur et de sa métrique de distance. Pour Milvus, interprétez la valeur conjointement avec search_metric.

    • Lorsque agg=False, chaque ligne d'entrée produit au plus top_k lignes de sortie avec M colonnes ajoutées. Une liste sélectionne les colonnes dans l'ordre déclaré et conserve leurs noms d'origine. Un mapping sélectionne les colonnes dans l'ordre de déclaration de ses clés et utilise les valeurs correspondantes comme alias de sortie.

    • Lorsque agg=True, chaque entrée ayant des résultats de recherche produit au plus une ligne de sortie, avec une colonne search_results de type ARRAY<ROW<...>> ajoutée. Par défaut, ignore_empty=False conserve tous les enregistrements d'entrée, et search_results est NULL lorsqu'une entrée n'a aucun résultat de recherche. Si vous définissez ignore_empty=True, les entrées sans résultats de recherche n'apparaissent pas dans le résultat. Chaque élément du tableau est une ROW contenant les M champs sélectionnés. Ce mode prend uniquement en charge une liste pour projeter les champs internes, et non un mapping. Après l'appel, renommez la colonne de tableau externe en appelant rename_columns("search_results", "new_name").

    • output_columns ne peut pas être vide, et ni les noms de colonnes ni les alias ne peuvent être vides ou dupliqués. Les colonnes sélectionnées doivent être des colonnes de premier niveau de search_source ou la colonne de similarité générée. L'ordre renvoyé correspond à l'ordre de déclaration de la liste ou des clés du mapping.

    • Si search_source possède déjà des colonnes telles que score ou score0, le moteur choisit un nom unique pour la colonne de similarité générée, tel que score2. Dans ce cas, utilisez le nom réel de la colonne dans output_columns.

    • En mode sans agrégation, vous pouvez utiliser un mapping pour attribuer aux colonnes de résultat des alias qui n'entrent pas en conflit. Si une liste ou la sortie par défaut entre en conflit avec les colonnes existantes du DataFrame actuel, renommez les colonnes conflictuelles avec rename_columns avant d'appeler vector_search. En mode avec agrégation, si le DataFrame actuel possède déjà une colonne search_results, renommez d'abord cette colonne.

    • Si le connecteur de la source de recherche vectorielle prend en charge la propagation descendante de l'élagage des colonnes, le moteur propage l'élagage de output_columns jusqu'au connecteur. Que la propagation soit prise en charge ou non, le résultat final contient uniquement les colonnes de résultat de recherche vectorielle sélectionnées.

  • Notes sur la mise à niveau depuis VVR 11.8

    Dans VVR 11.8, output_columns désigne l'alias de toutes les colonnes de sortie. Dans VVR 11.9 et versions ultérieures, il désigne les colonnes de résultat à sélectionner. Par exemple, l'appel suivant écrit pour VVR 11.8 :

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

    Après la mise à niveau, utilisez plutôt un mapping :

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

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

    Une liste projette les colonnes de résultat et conserve leurs noms d'origine. Pour spécifier des alias simultanément, utilisez un mapping :

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

    En mode avec agrégation, une liste sélectionne les champs de chaque élément du tableau, et la colonne de tableau externe est toujours nommée search_results. Pour renommer la colonne de tableau externe, appelez rename_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")

Intégration de texte

  • Nom de l'API : ai_embed.

    DataFrame.llm.ai_embed(
        input_col,
        dimension=1024,
        *,
        provider=None,
        model=None,
        cache_table=None,
        cache_key=None,
        config=None,
        **kwargs
    )
    
  • Description : Génère des intégrations vectorielles pour le texte.

  • Paramètres

    Nom du paramètre

    Type de paramètre

    Obligatoire

    Description

    input_col

    String / Expression

    Oui

    Le nom de la colonne de texte d'entrée ou une expression de colonne.

    dimension

    int

    Non

    La dimension du vecteur. Valeur par défaut : 1024.

    Consultez les descriptions des autres paramètres dans Invocation générique.

  • Valeur de retour

    Un DataFrame avec la colonne embedding (ARRAY<FLOAT>) ajoutée, qui contient le vecteur généré.

  • Exemple

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

Opérateurs multimodaux

L'API DataFrame vous permet d'appeler des opérateurs multimodaux pour lire, traiter et analyser des données multimodales telles que des images, de l'audio et de la vidéo. Pour plus d'informations, consultez Opérateurs multimodaux. Pour la documentation de l'API, consultez Expressions multimodales.

Environnement et configuration

API

Description

set_table_environment

Définit le TableEnvironment global

get_table_environment

Obtient le TableEnvironment actuel

get_or_create_table_environment

Obtient ou crée automatiquement un TableEnvironment

config.set(key, value)

Définit une option de configuration DataFrame

config.get(key)

Lit une option de configuration DataFrame

Modifier les paramètres d'exécution

  • Nom de l'API : DataFrameConfig.set.

    DataFrameConfig.set(
        key, value
    )
  • Description : Modifie les paramètres d'exécution d'un travail API DataFrame. Vous pouvez configurer les paramètres de travail Python et les paramètres Table API comme indiqué dans l'exemple suivant. Les paramètres configurés s'appliquent au TableEnvironment par défaut et remplacent les paramètres portant le même nom dans la Runtime parameter configuration du travail.

  • Paramètres

    Nom du paramètre

    Type de paramètre

    Obligatoire

    Description

    key

    String

    Oui

    Nom du paramètre.

    value

    String

    Oui

    Valeur du paramètre.

  • Valeur de retour

    L'objet DataFrameConfig lui-même, qui prend en charge le chaînage de méthodes.

  • Exemple

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

    Configurez les paramètres avant de définir la logique du travail afin de garantir qu'ils prennent effet comme prévu.