Converter uma tabela externa em uma tabela Unity Catalog .
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.
- Para obter detalhes sobre como converter uma tabela estrangeira em uma tabela do Unity Catalog, consulte Converter uma tabela estrangeira em uma tabela Unity Catalog .
- Para obter detalhes sobre como converter uma tabela externa em uma tabela do Unity Catalog, consulte Converter uma tabela externa em uma tabela Unity Catalog .
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 :
OWNERouMANAGEpermissões na mesa eCREATEpermissão noEXTERNAL LOCATION
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:
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 RUNQuando 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_SUCCESSse 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.
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 ).
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:
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.
Posso fazer a conversão no nível do esquema ou do catálogo?
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:
df = (dx.from_tables("prod.*.*")
.with_sql("ALTER TABLE {full_table_name} SET EXTERNAL;")
.apply()) # dry run with .explain()