Usar Python com pipelines autônomos
Você pode criar e refresh view materializadas autônomas e tabelas de transmissão de um Notebook usando Python. Isso permite que você gerencie pipelines autônomos juntamente com seus outros fluxos de trabalho de notebook baseados em Python.
Há duas formas de fazer isso:
- Defina a tabela com os decoradores
pyspark.pipelines,@dp.materialized_viewe@dp.table. Use isso quando a lógica for mais fácil de expressar como código de DataFrame. Consulte Definir tabelas com os decoradores de pipelines. - Envie as mesmas instruções SQL que um warehouse do Databricks SQL executa passando-as para
spark.sql(). Isso dá a você a superfície SQL completa e autônoma de view materializada e tabela de transmissão, incluindo declaraçõesREFRESHe programar de refresh. Consulte Enviar instruções SQL comspark.sql().
A fonte Python para pipelines autônomos requer um notebook anexado ao compute geral serverless . Você não pode usar Python para criar ou refresh pipelines autônomos de um Databricks SQL warehouse, pois um warehouse executa comandos SQL, não Notebooks Python. Para usar um SQL Warehouse em vez disso, consulte Usar views materializadas autônomas e Usar tabelas de transmissão autônomas.
Requisitos
Para criar e refresh pipelines autônomos com Python, você precisa de um Notebook anexado ao compute geral Serverless no Databricks Runtime 18.1 ou acima. Para ver a lista completa de requisitos, incluindo disponibilidade regional e permissões, consulte Notebooks.
Definir tabelas com os decoradores de pipelines
Você pode definir uma view materializada autônoma ou tabela de transmissão com os mesmos decoradores usados em um pipeline Lakeflow. Cada função decorada define uma tabela. Quando você executa a célula, o Databricks cria a tabela e executa um pipeline serverless para preenchê-la. A célula retorna quando a atualização termina.
Os decoradores de pipelines requerem a versão do ambiente serverless 5 ou acima.
Definir uma view materializada
Use @dp.materialized_view em uma função que retorna um DataFrame de lote. O exemplo a seguir cria a view materializada daily_booking_revenue a partir da tabela bookings no dataset de exemplo 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"))
)
Para definir uma tabela a partir de uma leitura de transmissão, use @dp.table em seu lugar.
Definir uma tabela de transmissão
Use @dp.table em uma função que retorna um DataFrame de transmissão. O exemplo a seguir cria a tabela de transmissão bookings_raw a partir de uma leitura de transmissão da mesma tabela 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")
Se a função retornar um DataFrame em lote, @dp.table criará uma view materializada. A única exceção é replace_where, que sempre resulta em uma tabela de transmissão. O exemplo a seguir mantém a receita diária de check-ins em ou após 1º de julho de 2025 atualizada, sem recalcular datas anteriores:
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"))
)
Cada execução exclui as linhas correspondentes ao predicado e recalcula apenas esse intervalo. Consulte Processamento em lote com fluxos REPLACE WHERE.
Refresh de uma tabela
Para refresh uma tabela que você definiu com um decorador, execute o código que a define novamente, por exemplo, executando novamente a célula do notebook, executando o notebook inteiro ou executando o notebook como um Job. Cada execução cria a tabela se ela não existir e a refresh se existir.
Para reprocessar todos os dados disponíveis na fonte, passe full_refresh=True em qualquer decorador:
@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")
Você não pode usar uma instrução REFRESH em uma tabela definida com um decorador ou programar atualizações com SCHEDULE ou TRIGGER ON UPDATE. Para refresh em programar, defina a tabela em SQL ou programe o Notebook como um Job. Consulte Lakeflow Jobs.
Configurar a tabela
Os decoradores aceitam os mesmos parâmetros comuns de dataset aceitos dentro de um pipeline, incluindo comment, table_properties, partition_cols, cluster_by, schema e 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"))
)
Para obter a lista de parâmetros, consulte materialized_view e table.
private=True não é compatível, pois uma tabela privada só pode ser lida por outros datasets no mesmo pipeline.
APIs sem compatibilidade
Uma tabela autônoma é um dataset único com um fluxo único, portanto, as APIs que descrevem as relações entre os datasets não estão disponíveis. O seguinte gera um erro fora de um pipeline:
@dp.temporary_viewedp.create_streaming_table@dp.append_flowe outros fluxos adicionaisdp.create_auto_cdc_flowedp.create_auto_cdc_from_snapshot_flow@dp.replace_flowe o parâmetroreplace_using, que definem fluxos REPLACE USING. Consulte Substituição parcial de snapshot com fluxos REPLACE USING.dp.create_sink- Expectativas, como
@dp.expecte@dp.expect_or_fail
Para usá-los, crie um LakeFlow Pipelines em vez disso. Consulte Desenvolver código de pipeline com Python.
Enviar comandos SQL com spark.sql()
Em um Notebook Python, passe as mesmas instruções que você faria a execução em um Databricks SQL warehouse para spark.sql(). A sintaxe de view materializada independente e tabela de transmissão é idêntica; apenas a maneira como você envia a declaração é diferente. Assim como em um warehouse, cada declaração CREATE ou REFRESH executa um pipeline serverless para processar a operação.
A sessão spark está disponível por default em Databricks Notebooks, portanto, não é necessária importação.
Criar uma view materializada
O exemplo a seguir cria a view materializada mv1 a partir da tabela-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
""")
Para obter detalhes completos sobre CREATE MATERIALIZED VIEW, como refresh agendadas e acionadas por Trigger, consulte Criar uma view materializada.
Criar uma tabela de transmissão
O exemplo a seguir cria a tabela de transmissão sales a partir da tabela raw_data:
spark.sql("""
CREATE OR REFRESH STREAMING TABLE sales
AS SELECT product, price FROM STREAM raw_data
""")
Para obter detalhes completos sobre CREATE STREAMING TABLE, incluindo carregamento de arquivos com Auto Loader e programação, consulte Usar tabelas de transmissão autônomas.
Refresh uma view materializada ou tabela de transmissão
Use uma declaração REFRESH para atualizar uma tabela autônoma com os dados mais recentes de sua fonte:
spark.sql("REFRESH MATERIALIZED VIEW mv1")
spark.sql("REFRESH STREAMING TABLE sales")
No compute geral Serverless, os refresh são síncronos. Não há suporte para refresh assíncronas (palavra-chave ASYNC). Consulte Compute geral serverless.
Parametrizar instruções
Para passar valores do seu código Python para uma instrução em vez de codificá-los, use marcadores de parâmetros nomeados no SQL e forneça seus valores por meio do argumento args de spark.sql(). Use um marcador como :min_sales diretamente para valores literais. Coloque o marcador em IDENTIFIER() somente quando o parâmetro for um nome de objeto, como uma tabela, view ou esquema, porque os identificadores não podem ser substituídos como valores de string simples.
O exemplo a seguir parametrizar tanto o nome da view materializada quanto um valor de filtro:
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,
})
Para obter mais informações, consulte Marcadores de parâmetro e Cláusula IDENTIFIER.
Execução outros comandos
Você pode fazer a execução de qualquer instrução de view materializada autônoma ou tabela de transmissão a partir de um Notebook Python passando-a para spark.sql(), incluindo instruções para programar refresh, alterar uma tabela ou remover uma tabela. Para entender como usar views materializadas e tabelas de transmissão, incluindo a sintaxe SQL, consulte Usar views materializadas autônomas e Usar tabelas de transmissão autônomas.
Limitações
Views materializadas e tabelas de transmissão autônomas criadas em compute geral Serverless têm limitações adicionais, como falta de suporte para refresh e sem atribuição de custo por tabela. Para obter a lista completa, consulte Compute geral serverless.
Como esses pipelines estão em execução em Serverless compute geral em vez de um SQL Warehouse, eles não herdam tags personalizadas de um warehouse delimitador. A propagação de tags do warehouse para system.billing.usage aplica-se apenas a materialized views e transmissão tables cujas instruções têm execução a partir de um SQL Warehouse. Consulte Atribuir custos ao SQL warehouse com tags personalizadas.
As tabelas definidas com os decoradores de pipelines têm as seguintes limitações adicionais:
- Não é possível fazer refresh delas com uma instrução
REFRESHou programar refreshes comSCHEDULEouTRIGGER ON UPDATE. Veja Refresh de uma tabela. - Expectativas, fluxos adicionais, fluxos de captura de dados de alterações (CDC), coletores e view temporárias não são compatíveis. Consulte APIs não suportadas.
private=Truenão é suportado.