Mover tabelas entre o pipeline declarativo LakeFlow
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 você move o fluxo atualiza a tabela, em vez do pipeline original. Isso é útil em muitos cenários, incluindo:
- Divida um pipeline grande em outros menores.
- mesclar vários pipelines em um único e maior.
- Alterar a frequência refresh de algumas tabelas em um pipeline.
- Mova tabelas de um pipeline que usa o modo de publicação legado 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 ver como você pode migrar o modo de publicação de um pipeline inteiro de uma só vez, consulte Habilitar o modo de publicação default em um pipeline.
- Mova tabelas pelo pipeline em diferentes espaços de trabalho.
Requisitos
A seguir estão os requisitos para mover uma tabela entre pipelines.
- 
Você deve usar Databricks Runtime 16.3 ou superior ao executar o comando ALTER ...e Databricks Runtime 17.2 para movimentação de tabelas entreworkspace .
- 
Tanto o pipeline de origem quanto o de destino devem ser: - De propriedade da account de usuário Databricks ou entidade de serviço que executa as operações
- Em espaços de trabalho que compartilham um metastore. Para verificar o metastore, consulte a funçãocurrent_metastore.
 
- 
O pipeline de destino deve usar o modo de publicação default . Isso permite que você publique tabelas em vários catálogos e esquemas. Como alternativa, ambos os pipelines devem usar 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 view materializada de um pipeline para outro.
- 
Pare o pipeline de origem se ele estiver em execução. Espere até que pare completamente. 
- 
Remova a definição da tabela do código do pipeline de origem e armazene-a em algum lugar para referência futura. Inclua quaisquer consultas ou códigos de suporte necessários para que o pipeline seja executado corretamente. 
- 
Em um Notebook ou editor SQL , execute o seguinte comando SQL para reatribuir a tabela do pipeline de origem para o pipeline de destino: SQLALTER [MATERIALIZED VIEW | STREAMING TABLE | TABLE] <table-name>
 SET TBLPROPERTIES("pipelines.pipelineId"="<destination-pipeline-id>");Observe que o comando SQL deve ser executado a partir do workspace do pipeline de origem. O comando usa ALTER MATERIALIZED VIEWeALTER STREAMING TABLEpara gerenciar visualizações materializadas e tabelas de transmissão Unity Catalog , respectivamente. Para executar a mesma ação em uma tabela Hive metastore , useALTER TABLE.Por exemplo, se você quiser mover uma tabela de transmissão chamada salespara um pipeline com o IDabcd1234-ef56-ab78-cd90-1234efab5678, você executaria o seguinte comando:SQLALTER STREAMING TABLE sales
 SET TBLPROPERTIES("pipelines.pipelineId"="abcd1234-ef56-ab78-cd90-1234efab5678");
O pipelineId deve ser um identificador de pipeline válido. O valor null não é permitido.
- Adicione a definição da tabela ao código do pipeline de destino.
Se o catálogo ou o esquema de destino forem diferentes entre a origem e o destino, copiar a consulta exatamente pode não funcionar. Tabelas parcialmente qualificadas na definição podem ser resolvidas de forma diferente. Pode ser necessário atualizar a definição ao mover para qualificar completamente os nomes das tabelas.
A mudança está concluída. Agora você pode executar o pipeline de origem e de destino. O pipeline de destino atualiza a tabela.
Solução de problemas
A tabela a seguir descreve erros que podem ocorrer ao mover uma tabela entre pipelines.
| Erro | Descrição | 
|---|---|
| 
 | O pipeline de origem 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. | 
| 
 | Somente a movimentação de tabelas entre o pipeline declarativo LakeFlow é suportada. pipeline para tabelas de transmissão e visualização materializada criadas com Databricks SQL não são suportados. | 
| 
 | O  | 
| A tabela não atualiza no destino após a movimentação. | Para mitigar rapidamente esse 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 executa as operações de movimentação. | 
| 
 | A tabela listada na mensagem de erro já existe. Isso pode acontecer se já existir uma tabela de apoio para o pipeline. Neste caso,  | 
Exemplo com várias tabelas em um pipeline
o pipeline pode conter mais de uma tabela. Você ainda pode mover uma tabela por vez entre pipelines. Neste cenário, há três tabelas (table_a, table_b, table_c) que leem umas das outras sequencialmente no pipeline de origem. Queremos mover uma tabela, table_b, para outro pipeline.
Código do pipeline de origem inicial:
from pyspark import pipelines as dp
from pyspark.sql.functions import col
@dp.table
def table_a():
    return spark.read.table("source_table")
# Table to be moved to new pipeline:
@dp.table
def table_b():
    return (
        spark.read.table("table_a")
        .select(col("column1"), col("column2"))
    )
@dp.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 origem e atualizando o pipelineId de table_b .
Primeiro, pause qualquer programa e aguarde a conclusão das atualizações no pipeline de origem e 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 do pipeline de origem atualizado se torna:
from pyspark import pipelines as dp
from pyspark.sql.functions import col
@dp.table
def table_a():
    return spark.read.table("source_table")
# Removed, to be in new pipeline:
# @dp.table
# def table_b():
#     return (
#         spark.read.table("table_a")
#         .select(col("column1"), col("column2"))
#     )
@dp.table
def table_c():
    return (
        spark.read.table("table_b")
        .groupBy(col("column1"))
        .agg(sum("column2").alias("sum_column2"))
    )
Vá para o editor SQL para executar o comando ALTER pipelineId .
ALTER MATERIALIZED VIEW table_b
  SET TBLPROPERTIES("pipelines.pipelineId"="<new-pipeline-id>");
Em seguida, vá para 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 , nenhuma alteração de código será necessária.
O código do pipeline de destino:
from pyspark import pipelines as dp
from pyspark.sql.functions import col
@dp.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 forem diferentes nas configurações pipeline , você deverá adicionar o nome totalmente qualificado usando o catálogo e o esquema do pipeline .
Por exemplo, o código do pipeline de destino poderia ser:
from pyspark import pipelines as dp
from pyspark.sql.functions import col
@dp.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"))
    )
executar (ou reativar programar) para o pipeline de origem e de destino.
Os oleodutos agora estão separados. A consulta para table_c lê de table_b (agora no pipeline de destino) e table_b lê de table_a (no pipeline de origem). Quando você faz uma execução disparada no pipeline de origem, table_b não é atualizado porque não é mais gerenciado pelo pipeline de origem. O pipeline de origem trata table_b como uma tabela externa ao pipeline. Isso é comparável à definição de uma leitura de view materializada de uma tabela Delta no Unity Catalog que não é gerenciada pelo pipeline.
Limitações
A seguir estão as limitações para mover tabelas entre pipelines.
- Visualizações materializadas e tabelas de transmissão criadas com Databricks SQL não são suportadas.
- Tabelas ou visualizações privadas não são suportadas.
- O pipeline de origem e destino deve ser pipeline. Pipelines nulos não são suportados.
- O pipeline de origem e destino deve estar no mesmo workspace ou em espaços de trabalho diferentes que compartilhem o mesmo metastore.
- Tanto o pipeline de origem quanto o de destino devem pertencer ao usuário que executa as operações de movimentação.
- Se o pipeline de origem usar o modo de publicação default , o pipeline de destino também deverá usar o modo de publicação default . Não é possível mover uma tabela de um pipeline usando o modo de publicação default para um pipeline que usa o esquema LIVE (legado). Veja o esquema LIVE (legado).
- Se o pipeline de origem e de destino estiverem usando o esquema LIVE (legado), eles deverão ter os mesmos valores catalogetargetnas configurações.