Comparteix via


Convierte una tabla foránea en una tabla del Catálogo de Unity externa

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.

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: OWNER o MANAGE permisos en la tabla y CREATE el permiso en EXTERNAL 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 RUN

    Cuando se especifica, comprueba si la tabla de origen se puede actualizar sin actualizar las tablas de destino. El comando devuelve DRY_RUN_SUCCESS si 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()