Nota
L'accés a aquesta pàgina requereix autorització. Pots provar d'iniciar sessió o canviar de directori.
L'accés a aquesta pàgina requereix autorització. Pots provar de canviar directoris.
Importante
Esta característica está en versión preliminar pública y solo está disponible para los clientes participantes en este momento. Para participar en la versión preliminar, aplíquelo rellenando este formulario. Esta característica solo admite la conversión de tablas externas federadas mediante HMS y Glue Federation.
En esta página se describe cómo usar SET EXTERNAL para convertir una tabla externa en una tabla externa.
- Para obtener más información sobre cómo convertir una tabla externa en una tabla administrada, consulte Conversión de una tabla externa en una tabla de catálogo de Unity administrada.
- Para obtener más información sobre cómo convertir una tabla externa en una tabla administrada, consulte Conversión de una tabla externa en una tabla de catálogo de Unity administrada.
Información general de SET EXTERNAL
Use la SET EXTERNAL característica para convertir una tabla externa en una tabla de Catálogo EXTERNAL de Unity en Azure Databricks.
SET EXTERNAL ofrece las ventajas siguientes:
- Conservar el historial de datos de las tablas
- Mantener las mismas configuraciones de tabla, incluidos el mismo nombre, configuración, permisos y vistas.
Prerrequisitos
-
Formato de datos: el formato de datos de la tabla externa debe ser uno de los siguientes:
- Delta
- Parquet
- ORC
- Avro
- JSON
- CSV
- Mensaje de texto
- Tipo de tabla: el tipo de tabla HMS debe ser una tabla externa HMS. El comando produce un error si la tabla es una tabla HMS administrada.
- Runtime: Databricks Runtime 17.3 o superior
-
Permisos:
OWNERoMANAGEpermisos en la tabla yCREATEel permiso enEXTERNAL LOCATION
Advertencia
No se admiten escrituras simultáneas en la tabla de origen ni en el catálogo de Unity. Es responsable de deshabilitar las lecturas y escrituras en la tabla de origen del catálogo externo y asegurarse de que las cargas de trabajo se han migrado al nuevo catálogo antes de realizar la conversión.
Syntax
Para convertir su tabla extranjera del Catálogo de Unity en una tabla externa del mismo, ejecute el siguiente comando:
ALTER TABLE source_table SET EXTERNAL [DRY RUN]
Parámetros
source_table
Una tabla externa existente en el catálogo de Unity. Las tablas externas contienen datos y metadatos administrados por un catálogo externo. Antes de la conversión, si elimina la tabla de origen en el catálogo externo, la tabla externa de referencia también se elimina en el Unity Catalog. Después de convertir la tabla en externa, quitar la tabla de origen en el catálogo externo no afecta a la tabla externa del Catálogo de Unity.
DRY RUNCuando se especifica, comprueba si la tabla de origen se puede actualizar sin actualizar las tablas de destino. El comando devuelve
DRY_RUN_SUCCESSsi se puede actualizar una tabla.
Reversión
Para revertir la migración de la tabla, elimine la tabla y, a continuación, se vuelva a federar como tabla extranjera en la siguiente sincronización del catálogo.
DROP TABLE catalog.schema.my_external_table;
Comprobación de la conversión
Puede confirmar que su tabla extranjera ha sido convertida en una tabla externa comprobando en el Explorador de Catálogos. Antes de la conversión, la tabla se muestra como Externa y después de la conversión se muestra como Externa.
Nota:
La ejecución DESCRIBE EXTENDED muestra el tipo de tabla como EXTERNAL antes y después de la conversión. Esto se debe a cómo funciona la Federación, ya que imita el comportamiento de ejecutar este comando en el catálogo hive_metastore. Para comprobar con precisión la conversión, use el Explorador de catálogos.
Preguntas más frecuentes
¿Puedo crear tablas, así como convertir tablas en un catálogo externo?
Sí, puede crear tablas externas o administradas en un catálogo externo. El comportamiento depende de la configuración del esquema:
-
Para los esquemas Glue o eHMS, o para esquemas con una ubicación administrada establecida en el catálogo de Unity: si ejecuta
CREATE TABLE foreign_catalog.schema.table, se crea una tabla administrada o externa del catálogo de Unity. La tabla no se envía ni se sincroniza con el catálogo externo. -
Para esquemas de conexiones internas de metastore de Hive: si intenta crear una tabla en un esquema extranjero, sigue creando una tabla extranjera y también crea una tabla en
hive_metastore. - Para el metastore de Hive de la área de trabajo heredada: dado que es una federación de lectura y escritura, si se crea una tabla en el catálogo externo, también se crea una tabla en el metastore interno de Hive.
¿Qué ocurre si mis tablas externas están en formato SerDe?
Para las tablas Parquet SerDe, es necesario modificar los metadatos de la tabla en AWS Glue antes de convertirla en una tabla externa. El siguiente script de Python usa la biblioteca de AWS boto3 para actualizar las propiedades necesarias:
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!")
¿Qué ocurre si mis tablas externas están respaldadas por DBFS?
Al convertir una tabla respaldada por DBFS, almacenamos la asignación actual de la ruta de acceso de DBFS a la ruta de acceso a la nube como ubicación de la ruta de acceso a la nube de la tabla externa.
¿Puedo cambiar al nivel de esquema o catálogo?
Puede recorrer en iteración las tablas de los esquemas para convertir individualmente o usar el proyecto discoverx labs para convertir esquemas completos o catálogos a la vez:
df = (dx.from_tables("prod.*.*")
.with_sql("ALTER TABLE {full_table_name} SET EXTERNAL;")
.apply()) # dry run with .explain()