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 |
|
|
Projection / opérations sur les colonnes |
select, with_column, with_columns, drop_columns, rename_columns |
|
Filtrage |
|
|
Agrégation |
|
|
Jointure / union |
|
|
<!--@p {"id":"d7474bf759n8o"}--br>Mapping des lignes |
|
|
Explosion (Explode) |
|
|
Déduplication |
|
|
Opérations ensemblistes |
union, union_all, minus, minus_all, intersect, intersect_all |
|
Limitation / pagination |
|
|
Partitionnement |
|
|
Pipe |
|
|
Gestion des valeurs nulles |
|
|
Sortie / collecte |
|
|
Débogage / plan d'exécution |
|
|
SQL |
Fonctions utilitaires pour les expressions
|
Fonction |
Description |
|
Crée une expression de référence de colonne. |
|
|
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 |
|
|
Entier |
DataType.int8, DataType.int16, DataType.int32, DataType.int64 |
|
Flottant / décimal |
|
|
Chaîne |
|
|
Binaire |
|
|
Date / heure |
DataType.date, DataType.time, DataType.timestamp, DataType.timestamp_ltz |
|
Composé |
|
|
Spécial |
|
|
Multimodal |
|
|
Modificateur de nullabilité |
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",
),
}
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 |
|
|
Fichier JSON |
|
|
Kafka |
|
|
MaxCompute (ODPS) |
|
|
Paimon |
|
|
SLS (Simple Log Service) |
|
|
Hologres |
|
|
Milvus |
|
|
Image vidéo |
|
|
Connecteurs génériques/personnalisés |
Écrire des données
|
Sink |
API |
|
Fichier Parquet |
|
|
Fichier JSON |
|
|
Kafka |
|
|
MaxCompute (ODPS) |
|
|
Paimon |
|
|
SLS (Simple Log Service) |
|
|
Hologres |
|
|
Milvus |
|
|
|
Prise en charge à partir de VVR 11.9.preview.1. |
|
Connecteurs génériques/personnalisés |
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 |
|
Crée un Catalog |
|
|
Récupère un objet Catalog enregistré |
|
|
Bascule vers le Catalog actuel |
|
|
Récupère le Catalog actuel |
|
|
Liste les Catalogs |
|
|
Bascule vers la base de données actuelle |
|
|
Récupère la base de données actuelle |
|
|
Liste les bases de données du Catalog actuel |
|
|
Lit une table de Catalog sous forme de DataFrame |
|
|
É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_batcheset 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(),
}),
)
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({...})ouTypedDict.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_mapoujoin_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 |
|
Enregistre un fournisseur de modèles. |
|
|
Définit le fournisseur par défaut (pour les scénarios impliquant plusieurs fournisseurs). |
|
|
Liste les fournisseurs enregistrés. |
Types de fournisseurs pris en charge :
|
Fournisseur |
Cas d'utilisation |
|
OpenAI, DeepSeek, DashScope (Model Studio) et toutes les interfaces compatibles avec OpenAI. |
|
|
Alibaba Cloud DashScope, qui prend en charge l'embedding multimodal. |
|
|
NVIDIA Triton Inference Server |
|
|
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 instanceModelProvider; 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 exceptionValueError.-
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,dashscopeoutriton, le fournisseur correspondant est créé. Dans le cas contraire, unGenericProviderest 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 STRINGest ajouté. Si vous passez une chaîne de type SQL ou unDataTypenon structuré, une seule colonne nomméeoutputest ajoutée. Si vous passezDataType.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
OpenAICompatProviderou deDashScopeProvider, vous pouvez passercontent_type,system_prompt,user_prompt,temperature, etc. -
Valeur de retour
Un DataFrame auquel est ajoutée la sortie du modèle, dans la colonne
outputpar 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"])RemarqueSeul 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.
RemarqueLes 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) etconfidence(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) etdetected_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) etdetected_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
La méthode
vector_searchest prise en charge à partir de VVR 11.8 et versions ultérieures.Les fonctionnalités de projection des colonnes de résultat
output_columnset 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_columnsrenomme uniquement toutes les colonnes de sortie : en mode sans agrégation, vous devez fournir autant de noms que de colonnes dans la table vectorielle, plusscore; 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 desearch_sourceet la colonnescoregé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_columnssélectionne M colonnes de résultat au total :Si vous ne spécifiez pas
output_columns, toutes les colonnes desearch_sourceet une colonne de score de recherche de typeDOUBLEsont renvoyées. Par défaut, la colonne de score est nomméescore. 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 avecsearch_metric.Lorsque
agg=False, chaque ligne d'entrée produit au plustop_klignes 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 colonnesearch_resultsde typeARRAY<ROW<...>>ajoutée. Par défaut,ignore_empty=Falseconserve tous les enregistrements d'entrée, etsearch_resultsestNULLlorsqu'une entrée n'a aucun résultat de recherche. Si vous définissezignore_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 appelantrename_columns("search_results", "new_name").output_columnsne 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 desearch_sourceou 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_sourcepossède déjà des colonnes telles quescoreouscore0, le moteur choisit un nom unique pour la colonne de similarité générée, tel quescore2. Dans ce cas, utilisez le nom réel de la colonne dansoutput_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_columnsavant d'appelervector_search. En mode avec agrégation, si le DataFrame actuel possède déjà une colonnesearch_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_columnsjusqu'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_columnsdé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, appelezrename_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 |
|
Définit le TableEnvironment global |
|
|
Obtient le TableEnvironment actuel |
|
|
Obtient ou crée automatiquement un TableEnvironment |
|
|
Définit une option de configuration DataFrame |
|
|
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
TableEnvironmentpar 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")RemarqueConfigurez les paramètres avant de définir la logique du travail afin de garantir qu'ils prennent effet comme prévu.