Mover tabelas entre LakeFlow Pipeline declarativo
Este artigo descreve como mover tabelas de transmissão e visualizações materializadas entre pipelines. Após a movimentação, o pipeline para o qual o fluxo é movido atualiza a tabela, em vez do pipeline original. Isso é útil em muitos cenários, incluindo:
- Dividir um pipeline grande em pipelines menores.
- mesclar vários pipelines em um único pipeline maior.
- Altere a frequência do refresh para algumas tabelas em um pipeline.
- Mova tabelas de um pipeline que utiliza o modo de publicação antigo para o modo de publicação default. Para obter detalhes sobre o modo de publicação legado, consulte Modo de publicação legado para pipeline. Para saber como migrar o modo de publicação de um pipeline inteiro de uma só vez, consulte Ativar o modo de publicação default em um pipeline.
Requisitos
A seguir estão os requisitos para mover uma tabela entre pipelines.
-
É necessário utilizar o Databricks Runtime 16.3 ou superior ao executar o comando
ALTER ...
. -
Tanto o pipeline de origem quanto o de destino devem ser:
- No mesmo workspace
- De propriedade do usuário Databricks account ou da entidade de serviço que executa as operações
-
O destino pipeline deve utilizar o modo de publicação default. Isso permite que você publique tabelas em vários catálogos e esquemas.
Alternativamente, ambos os pipelines devem utilizar o modo de publicação legado e ambos devem ter o mesmo catálogo e valor de destino nas configurações. Para obter informações sobre o modo de publicação legado, consulte Esquema LIVE (legado).
Este recurso não suporta a movimentação de um pipeline usando o modo de publicação default para um pipeline usando o modo de publicação legado.
Mover uma tabela entre pipelines
As instruções a seguir descrevem como mover uma tabela de transmissão ou materializada view de um pipeline para outro.
-
Interrompa o pipeline de origem se ele estiver em execução. Espere que ele pare completamente.
-
Remova a definição da tabela do Notebook ou arquivo de origem pipelinee armazene-a em algum lugar para referência futura.
Inclua qualquer consulta ou código de suporte necessário para que o site pipeline seja executado corretamente.
-
Em um Notebook ou em um editor SQL, execute o seguinte comando SQL para reatribuir a tabela da origem pipeline para o destino pipeline:
SQLALTER [MATERIALIZED VIEW | STREAMING TABLE | TABLE] <table-name>
SET TBLPROPERTIES("pipelines.pipelineId"="<destination-pipeline-id>");O comando utiliza
ALTER MATERIALIZED VIEW
eALTER STREAMING TABLE
para Unity Catalog gerenciar as tabelas de visualização materializada e transmissão, respectivamente. Para realizar a mesma ação em uma tabela do Hive metastore, utilizeALTER TABLE
.Por exemplo, se quiser mover uma tabela de transmissão chamada
sales
para uma pipeline com o IDabcd1234-ef56-ab78-cd90-1234efab5678
, o senhor executaria o seguinte comando:SQLALTER STREAMING TABLE sales
SET TBLPROPERTIES("pipelines.pipelineId"="abcd1234-ef56-ab78-cd90-1234efab5678");
O endereço pipelineId
deve ser um identificador de pipeline válido. O valor null
não é permitido.
- Adicione a definição da tabela ao Notebook/file do site pipelinede destino.
Se o catálogo ou o esquema de destino diferirem entre a origem e o destino, copiar a consulta com exatidão pode não funcionar. Tabelas parcialmente qualificadas na definição podem ser resolvidas de forma diferente. Talvez seja necessário atualizar a definição durante a movimentação.
A mudança está completa. Agora é possível executar o pipeline de origem e o pipeline de destino. O pipeline de destino atualiza a tabela.
Solução de problemas
A tabela a seguir descreve os erros que podem ocorrer ao mover uma tabela entre pipelines.
Erro | Descrição |
---|---|
| A origem pipeline está no modo de publicação default e o destino usa o modo de esquema LIVE (legado). Isso não é suportado. Se a origem usar o modo de publicação default, o destino também deverá usar. |
| Apenas é possível mover tabelas entre um pipeline declarativ LakeFlow. O pipeline para tabelas de transmissão e visualizações materializadas criadas com Databricks SQL não é compatível. |
| O endereço |
A tabela não é atualizada no destino após a mudança. | Para mitigar rapidamente neste caso, mova a tabela de volta para o pipeline de origem seguindo as mesmas instruções. |
| Tanto o pipeline de origem quanto o de destino devem pertencer ao usuário que está realizando as operações de movimentação. |
| A tabela listada na mensagem de erro já existe. Isso pode ocorrer se já existir uma tabela de apoio para o pipeline. Nesse caso, |
Exemplo com várias tabelas em um pipeline
O pipeline pode conter mais de uma tabela. Ainda é possível mover uma tabela por vez entre o pipeline. Neste cenário, existem três tabelas (table_a
, table_b
, table_c
) que se leem sequencialmente na pipeline de origem. Desejamos transferir uma tabela, table_b
, para outro pipeline.
Código inicial do pipeline de origem:
import dlt
from pyspark.sql.functions import col
@dlt.table
def table_a():
return spark.read.table("source_table")
# Table to be moved to new pipeline:
@dlt.table
def table_b():
return (
spark.read.table("table_a")
.select(col("column1"), col("column2"))
)
@dlt.table
def table_c():
return (
spark.read.table("table_b")
.groupBy(col("column1"))
.agg(sum("column2").alias("sum_column2"))
)
Movemos table_b
para outro pipeline copiando e removendo a definição da tabela da fonte e atualizando o pipelineId de table_b
.
Primeiro, interrompa qualquer programa e aguarde a conclusão das atualizações no pipeline de origem e no pipeline de destino. Em seguida, modifique o pipeline de origem para remover o código da tabela que está sendo movida. O código de exemplo atualizado do pipeline de origem fica assim:
import dlt
from pyspark.sql.functions import col
@dlt.table
def table_a():
return spark.read.table("source_table")
# Removed, to be in new pipeline:
# @dlt.table
# def table_b():
# return (
# spark.read.table("table_a")
# .select(col("column1"), col("column2"))
# )
@dlt.table
def table_c():
return (
spark.read.table("table_b")
.groupBy(col("column1"))
.agg(sum("column2").alias("sum_column2"))
)
Acesse o editor do SQL para executar o comando ALTER pipelineId
.
ALTER MATERIALIZED VIEW table_b
SET TBLPROPERTIES("pipelines.pipelineId"="<new-pipeline-id>");
Em seguida, acesse o pipeline de destino e adicione a definição de table_b
. Se o catálogo e o esquema default forem os mesmos nas configurações pipeline, não será necessário alterar o código.
O código do pipeline de destino:
import dlt
from pyspark.sql.functions import col
@dlt.table(name="table_b")
def table_b():
return (
spark.read.table("table_a")
.select(col("column1"), col("column2"))
)
Se o catálogo e o esquema default diferirem nas configurações pipeline, é necessário adicionar o nome totalmente qualificado usando o catálogo e o esquema pipeline.
Por exemplo, o código do pipeline de destino poderia ser:
import dlt
from pyspark.sql.functions import col
@dlt.table(name="source_catalog.source_schema.table_b")
def table_b():
return (
spark.read.table("source_catalog.source_schema.table_a")
.select(col("column1"), col("column2"))
)
execução (ou reativar programar) para o pipeline de origem e de destino.
Os pipelines estão agora separados. A consulta para table_c
é lida em table_b
(agora no pipeline de destino) e table_b
é lida em table_a
(no pipeline de origem). Quando você realiza uma execução acionada na fonte pipeline, table_b
não é atualizado porque não é mais gerenciado pela fonte pipeline. O pipeline de origem trata table_b
como uma tabela externa ao pipeline. Isso é comparável a definir uma leitura materializada view a partir de uma tabela Delta em Unity Catalog que não é gerenciada pelo pipeline.
Limitações
A seguir, as limitações para mover tabelas entre pipelines.
- Não há suporte para tabelas de visualização materializada e transmissão criadas com Databricks SQL.
- Não há suporte para tabelas ou visualizações privadas.
- O pipeline de origem e destino deve ser pipeline. Pipelines nulos não são suportados.
- Tanto o pipeline de origem quanto o de destino devem estar no mesmo site workspace.
- Tanto o pipeline de origem quanto o de destino devem ser de propriedade do usuário que está executando as operações de movimentação.
- Se a fonte pipeline usar o modo de publicação default, o destino pipeline também deverá estar usando o modo de publicação default. O senhor não pode mover uma tabela de um pipeline usando o modo de publicação default para um pipeline que usa o esquema LIVE (legado). Consulte esquema LIVE (legado).
- Se o pipeline de origem e o de destino estiverem usando o esquema LIVE (legado), eles deverão ter os mesmos valores
catalog
etarget
nas configurações.