Utiliser Python avec des pipelines autonomes
Vous pouvez créer et refresh des vues matérialisées et des tables de streaming autonomes à partir d'un Notebook à l'aide de Python. Cela vous permet de gérer des pipelines autonomes avec vos autres workflows de notebooks basés sur Python.
Pour ce faire, deux méthodes sont possibles :
- Définissez la table avec les décorateurs
pyspark.pipelines,@dp.materialized_viewet@dp.table. À utiliser lorsque la logique est plus facile à exprimer sous forme de code DataFrame. Voir Définir des tables avec les décorateurs de pipeline. - Soumettez les mêmes instructions SQL qu'un Databricks SQL Warehouse exécute en les transmettant à
spark.sql(). Cela vous donne la surface SQL complète pour les vues matérialisées et les tables de streaming autonomes, y compris les instructionsREFRESHet les programmes de refresh. Consultez Soumettre des instructions SQL avecspark.sql().
Le code source Python pour les pipelines autonomes nécessite un notebook connecté au compute général serverless . Vous ne pouvez pas utiliser Python pour créer ou refresh des pipelines autonomes à partir d’un warehouse Databricks SQL, car un warehouse exécute des instructions SQL, pas des Notebook Python. Pour utiliser un SQL warehouse à la place, voir Utiliser des vues matérialisées autonomes et Utiliser des tables streaming autonomes.
Prérequis
Pour créer et refresh des pipelines autonomes avec Python, vous avez besoin d’un Notebook connecté au compute general Serverless sur Databricks Runtime 18.1 ou version supérieure. Pour obtenir la liste complète des prérequis, notamment la disponibilité régionale et les autorisations, consultez la section Notebooks.
Définir des tables avec les décorateurs de pipelines
Vous pouvez définir une vue matérialisée ou une table de streaming autonome avec les mêmes décorateurs que ceux utilisés dans un LakeFlow Pipelines. Chaque fonction décorée définit une table. Lorsque vous exécutez la cellule, Databricks crée la table et exécute un pipeline serverless pour la remplir. La cellule renvoie une valeur lorsque la mise à jour est terminée.
Les décorateurs de pipelines nécessitent la version 5 ou supérieure de l’environnement serverless.
Définir une vue matérialisée
Utilisez @dp.materialized_view sur une fonction qui renvoie un DataFrame batch. L’exemple suivant montre comment créer la vue matérialisée daily_booking_revenue à partir de la table bookings dans le dataset d’exemple Wanderbricks:
from pyspark import pipelines as dp
from pyspark.sql import functions as F
@dp.materialized_view(name="main.default.daily_booking_revenue")
def daily_booking_revenue():
return (
spark.read.table("samples.wanderbricks.bookings")
.groupBy("check_in")
.agg(F.sum("total_amount").alias("total_revenue"))
)
Pour définir une table à partir d'une lecture en streaming, utilisez @dp.table à la place.
Définir une table de streaming
Utilisez @dp.table sur une fonction qui renvoie un DataFrame de streaming. L'exemple suivant crée la table de streaming bookings_raw à partir d'une lecture en streaming de la même table bookings :
from pyspark import pipelines as dp
@dp.table(name="main.default.bookings_raw")
def bookings_raw():
return spark.readStream.table("samples.wanderbricks.bookings").select("booking_id", "property_id", "total_amount")
Si la fonction renvoie un DataFrame batch, @dp.table crée plutôt une vue matérialisée. La seule exception est replace_where, qui donne toujours lieu à une table de streaming. L'exemple suivant maintient à jour le revenu quotidien des enregistrements effectués à partir du 1er juillet 2025, sans recalculer les dates précédentes :
from pyspark import pipelines as dp
from pyspark.sql import functions as F
@dp.table(
name="main.default.booking_revenue_rw",
replace_where=F.col("check_in") >= F.to_date(F.lit("2025-07-01")),
)
def booking_revenue_rw():
return (
spark.read.table("samples.wanderbricks.bookings")
.groupBy("check_in")
.agg(F.sum("total_amount").alias("total_revenue"))
)
Chaque exécution supprime les lignes correspondant au prédicat et ne recalcule que cette plage. Voir Traitement par batch avec des flux REPLACE WHERE.
refresh une table
Pour refresh une table que vous avez définie avec un décorateur, réexécutez le code qui la définit, par exemple en réexécutant la cellule du Notebook, en exécutant l’intégralité du Notebook ou en exécutant le Notebook en tant que job. Chaque exécution crée la table si elle n’existe pas et la refresh si elle existe.
Pour traiter à nouveau toutes les données disponibles dans la source, passez full_refresh=True sur l’un ou l’autre décorateur :
@dp.table(name="main.default.bookings_raw", full_refresh=True)
def bookings_raw():
return spark.readStream.table("samples.wanderbricks.bookings").select("booking_id", "property_id", "total_amount")
Vous ne pouvez pas utiliser une instruction REFRESH sur une table définie avec un décorateur, ou planifier des refresh avec SCHEDULE ou TRIGGER ON UPDATE. Pour refresh selon un calendrier, définissez la table en SQL ou planifiez le Notebook en tant que Job. Voir Lakeflow Jobs.
Configurer la table
Les décorateurs acceptent les mêmes paramètres de dataset courants que ceux qu’ils acceptent dans un pipeline, notamment comment, table_properties, partition_cols, cluster_by, schema et spark_conf:
@dp.materialized_view(
name="main.default.daily_booking_revenue",
comment="Daily booking revenue.",
table_properties={"quality": "gold"},
cluster_by=["check_in"],
)
def daily_booking_revenue():
return (
spark.read.table("samples.wanderbricks.bookings")
.groupBy("check_in")
.agg(F.sum("total_amount").alias("total_revenue"))
)
Pour la liste des paramètres, consultez materialized_view et table.
private=True n'est pas pris en charge, car une table privée ne peut être lue que par d'autres jeux de données dans le même pipeline.
APIs non prises en charge
Une table autonome est un dataset unique avec un flux unique, de sorte que les APIs qui décrivent les relations entre les datasets ne sont pas disponibles. Ce qui suit génère une erreur en dehors d'un pipeline :
@dp.temporary_viewetdp.create_streaming_table@dp.append_flowet d'autres flux supplémentairesdp.create_auto_cdc_flowetdp.create_auto_cdc_from_snapshot_flow@dp.replace_flowet le parameterreplace_using, qui définit les flux REPLACE USING. Voir Remplacement partiel de snapshot avec des flux REPLACE USING.dp.create_sink- Attentes, telles que
@dp.expectet@dp.expect_or_fail
Pour les utiliser, créez plutôt un pipeline LakeFlow Pipelines. Voir Développer le code de pipeline avec Python.
Envoyer des instructions SQL avec spark.sql()
Dans un Notebook Python, transmettez les mêmes instructions que celles que vous exécuteriez depuis un warehouse Databricks SQL vers spark.sql(). La syntaxe des vues matérialisées et des tables de streaming autonomes est identique ; seule la méthode de soumission de l’instruction diffère. Comme pour un warehouse, chaque instruction CREATE ou REFRESH exécute un pipeline serverless pour traiter l’opération.
La session spark est disponible par default dans les notebooks Databricks ; aucune importation n’est donc requise.
Créer une vue matérialisée
L’exemple suivant montre comment créer la vue matérialisée mv1 à partir de la table de base base_table1:
spark.sql("""
CREATE OR REPLACE MATERIALIZED VIEW mv1
AS SELECT
date,
sum(sales) AS sum_of_sales
FROM base_table1
GROUP BY date
""")
Pour obtenir des détails complets sur CREATE MATERIALIZED VIEW, comme les refresh planifiés et Trigger, voir Créer une vue matérialisée.
Créer une table de streaming
L'exemple suivant crée la table de streaming sales à partir de la table raw_data :
spark.sql("""
CREATE OR REFRESH STREAMING TABLE sales
AS SELECT product, price FROM STREAM raw_data
""")
Pour tous les détails sur CREATE STREAMING TABLE, y compris le chargement des fichiers avec Auto Loader et la planification, voir Utiliser des tables streaming autonomes.
refresh une vue matérialisée ou une table de streaming
Utilisez une instruction REFRESH pour mettre à jour une table autonome avec les données les plus récentes provenant de sa source :
spark.sql("REFRESH MATERIALIZED VIEW mv1")
spark.sql("REFRESH STREAMING TABLE sales")
Sur un compute général Serverless, les refresh sont synchrones. Les refresh asynchrones (mot-clé ASYNC) ne sont pas prises en charge. Voir Compute général serverless.
Paramétrer des instructions
Pour transmettre des valeurs de votre code Python à une instruction au lieu de les coder en dur, utilisez des marqueurs de paramètres nommés dans le SQL et fournissez leurs valeurs par le biais de l’argument args de spark.sql(). Utilisez un marqueur tel que :min_sales directement pour les valeurs littérales. Placez le marqueur entre IDENTIFIER() uniquement lorsque le parameter est un nom d'objet, tel qu'une table, une vue ou un schéma, car les identifiants ne peuvent pas être substitués par des valeurs de chaîne simples.
L’exemple suivant paramètre à la fois le nom de la vue matérialisée et une valeur de filtre :
mv_name = "main.sales.regional_sales"
min_sales = 1000
spark.sql("""
CREATE OR REPLACE MATERIALIZED VIEW IDENTIFIER(:mv)
AS SELECT
region,
sum(sales) AS sum_of_sales
FROM base_table1
WHERE sales > :min_sales
GROUP BY region
""", args={
"mv": mv_name,
"min_sales": min_sales,
})
Pour plus d’information, voir Marqueurs de parameter et clause IDENTIFIER.
Exécuter d’autres instructions
Vous pouvez exécuter n’importe quelle instruction de vue matérialisée ou de table de streaming autonome à partir d’un notebook Python en la transmettant à spark.sql(), notamment les instructions pour planifier des refresh, modifier une table ou supprimer une table. Pour comprendre comment utiliser les vues matérialisées et les tables de streaming, y compris la syntaxe SQL, voir Utiliser des vues matérialisées autonomes et Utiliser des tables de streaming autonomes.
Limitations
Les vues matérialisées autonomes et les tables streaming créées sur un compute général Serverless ont des limitations supplémentaires, comme l’absence de prise en charge des refresh asynchrones et l’absence d’attribution des coûts par table. Pour la liste complète, voir Compute général serverless.
Comme ces pipelines s’exécutent sur le compute général serverless plutôt que sur un SQL warehouse, ils n’héritent pas des tags personnalisés d’un warehouse englobant. La propagation des tags de warehouse à system.billing.usage s’applique uniquement aux vues matérialisées et aux tables de streaming dont les instructions s’exécutent à partir d’un SQL warehouse. Consultez Attribuer des coûts au SQL warehouse avec des tags personnalisés.
Les tables définies avec les décorateurs de pipelines présentent les limites supplémentaires suivantes :
- Vous ne pouvez pas les refresh avec une instruction
REFRESHou planifier des refresh avecSCHEDULEouTRIGGER ON UPDATE. Voir refresh une table. - Les attentes, les flux supplémentaires, les flux de Change Data Capture (CDC), les puits et les vues temporaires ne sont pas pris en charge. Voir APIs non prises en charge.
private=Truen’est pas pris en charge.