Pular para o conteúdo principal

Converter uma tabela externa em uma tabela Unity Catalog .

info

Visualização

Este recurso está em versão prévia pública e, no momento, está disponível apenas para clientes participantes. Para participar da pré-estreia, inscreva-se preenchendo este formulário. Este recurso suporta apenas a conversão de tabelas estrangeiras federadas usando HMS e Glue Federation.

Esta página descreve como usar SET EXTERNAL para converter uma tabela estrangeira em uma tabela externa.

Visão geralSET EXTERNAL

Use o recurso SET EXTERNAL para converter uma tabela estrangeira em uma tabela do Unity Catalog EXTERNAL no Databricks. SET EXTERNAL oferece os seguintes benefícios:

  • Retenção da tabela história
  • Mantendo as mesmas configurações de tabela, incluindo o mesmo nome, configurações, permissões e visualização.

Pré-requisitos

  • Formato dos dados : O formato dos dados da tabela estrangeira deve ser um dos seguintes:

    • Delta
    • PARQUET
    • ORC
    • AVRO
    • JSON
    • CSV
    • TEXT
  • Tipo de tabela : O tipo de tabela HMS deve ser uma tabela HMS externa. O comando falha se a tabela for uma tabela de gerenciamento HMS .

  • Runtime : Databricks Runtime 17.3 ou superior

  • Permissões : OWNER ou MANAGE permissões na mesa e CREATE permissão no EXTERNAL LOCATION

atenção

Não são suportadas gravações simultâneas na tabela de origem e no Unity Catalog . Você é responsável por desabilitar as operações de leitura e gravação na tabela de origem no catálogo externo e garantir que as cargas de trabalho tenham migrado para o novo catálogo antes de realizar a conversão.

Sintaxe

Para converter sua tabela estrangeira Unity Catalog em uma tabela externa Unity Catalog , execute o seguinte comando:

SQL
ALTER TABLE source_table SET EXTERNAL [DRY RUN]

Parâmetros

  • tabela_de_origem

    Uma tabela estrangeira existente no Unity Catalog. Tabelas externas contêm dados e metadados gerenciados por um catálogo externo. Antes da conversão, se você soltar a tabela de origem no catálogo externo, a tabela estrangeira também será solta no Unity Catalog. Após a tabela ser convertida para externa, excluir a tabela de origem do catálogo externo não afeta a tabela externa Unity Catalog .

  • DRY RUN

    Quando especificado, verifica se a tabela de origem pode ser atualizada sem que as tabelas de destino também possam ser atualizadas. O comando retorna DRY_RUN_SUCCESS se uma tabela puder ser atualizada.

Reverter

Para reverter a migração da tabela, basta excluí-la, e ela será refederada como tabela estrangeira na próxima sincronização do catálogo.

SQL
DROP TABLE catalog.schema.my_external_table;

Verificar conversão

Você pode confirmar se sua tabela estrangeira foi convertida em uma tabela externa verificando no Explorador de Catálogo. Antes da conversão, a tabela aparece como "Foreign" (Estrangeira ) e, após a conversão, aparece como "External" (Externa ).

nota

Executar DESCRIBE EXTENDED mostra o tipo de tabela como EXTERNAL tanto antes quanto depois da conversão. Isso se deve ao modo como a Federação funciona, pois imita o comportamento de executar este comando no catálogo hive_metastore . Para verificar com precisão a conversão, utilize o Explorador de Catálogo.

Perguntas frequentes

Posso criar tabelas, assim como converter tabelas, em um catálogo externo?

Sim, você pode criar tabelas externas ou tabelas gerenciais em um catálogo estrangeiro. O comportamento depende da configuração do esquema:

  • Para esquemas Glue ou eHMS , ou para esquemas com um local de gerenciamento definido no Unity Catalog : Se você executar CREATE TABLE foreign_catalog.schema.table, isso cria um gerenciamento Unity Catalog ou tabela externa. A tabela não é enviada nem sincronizada com o catálogo externo.
  • Para esquemas de conexões internas Hive metastore : Se você tentar criar uma tabela em um esquema externo, ele ainda cria uma tabela externa e também cria uma tabela em hive_metastore.
  • Para Hive metastore workspace legado : Como se trata de uma federação de leitura e gravação, se você criar uma tabela no catálogo externo, ela também será criada no Hive metastore interno.

E se minhas tabelas estrangeiras estiverem no formato SerDe?

Para tabelas Parquet SerDe no AWS Glue, você deve modificar os metadados da tabela antes de convertê-la em uma tabela externa. O seguinte script em Python utiliza a biblioteca AWS boto3 para atualizar as propriedades necessárias:

Python
import boto3
import json

# Initialize boto3 Glue client with your AWS region
glue_client = boto3.client('glue', region_name='<your-aws-region>') # Example: 'us-west-2'

# Configure your table details
DATABASE_NAME = '<your-database-name>' # Example: 'my_database'
TABLE_NAME = '<your-table-name>' # Example: 'my_parquet_table'
SPARK_PROVIDER = 'PARQUET'
SPARK_PARTITION_PROVIDER = 'filesystem'

# Step 1: Get the current table definition
print(f"Retrieving current table definition for {DATABASE_NAME}.{TABLE_NAME}...")
response = glue_client.get_table(DatabaseName=DATABASE_NAME, Name=TABLE_NAME)

# Extract the table's current definition
table_definition = response['Table']

# Step 2: Verify if the table is a Parquet SerDe
serde_library = table_definition['StorageDescriptor']['SerdeInfo'].get('SerializationLibrary', '')
is_parquet_serde = serde_library == "org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe"

if not is_parquet_serde:
print(f"The table {TABLE_NAME} does not use a Parquet SerDe. Found: {serde_library}")
else:
print(f"Table {TABLE_NAME} is using a Parquet SerDe.")

# Step 3: Extract the S3 path dynamically from the Location field
s3_path = table_definition['StorageDescriptor']['Location']
print(f"S3 Path found: {s3_path}")

# Step 4: Modify the SerDe and table properties
# Modify SerDe parameters
if 'SerdeInfo' in table_definition['StorageDescriptor']:
if 'Parameters' not in table_definition['StorageDescriptor']['SerdeInfo']:
table_definition['StorageDescriptor']['SerdeInfo']['Parameters'] = {}
table_definition['StorageDescriptor']['SerdeInfo']['Parameters']['path'] = s3_path

# Modify table properties
if 'Parameters' not in table_definition:
table_definition['Parameters'] = {}

# Set both spark.sql.sources.provider and spark.sql.partitionProvider
table_definition['Parameters']['spark.sql.sources.provider'] = SPARK_PROVIDER
table_definition['Parameters']['spark.sql.partitionProvider'] = SPARK_PARTITION_PROVIDER

# Remove metadata fields that are not accepted by update_table API
table_definition.pop('CreateTime', None)
table_definition.pop('UpdateTime', None)
table_definition.pop('LastAccessTime', None)
table_definition.pop('Retention', None)
table_definition.pop("DatabaseName", None)
table_definition.pop('CreatedBy', None)
table_definition.pop('IsRegisteredWithLakeFormation', None)
table_definition.pop('CatalogId', None)
table_definition.pop('VersionId', None)

# Step 5: Update the table with the modified properties
print(f"Updating the table {TABLE_NAME} in Glue...")
response = glue_client.update_table(
DatabaseName=DATABASE_NAME, # Correct use of DatabaseName
TableInput=table_definition,
)

print(f"Table {TABLE_NAME} updated successfully!")

E se minhas tabelas estrangeiras forem baseadas em DBFS?

Ao converter uma tabela com suporte DBFS , armazenamos o mapeamento atual do caminho do DBFS para o caminho cloud como a localização do caminho cloud da tabela externa.

Você pode percorrer as tabelas em seus esquemas para convertê-las individualmente ou utilizar o projeto discoverx labs para converter esquemas ou catálogos inteiros de uma só vez:

Python
df = (dx.from_tables("prod.*.*")
.with_sql("ALTER TABLE {full_table_name} SET EXTERNAL;")
.apply()) # dry run with .explain()