Delen via


Een vreemde tabel converteren naar een externe Unity Catalog-tabel

Belangrijk

Deze functie bevindt zich in openbare preview en is op dit moment alleen beschikbaar voor deelnemende klanten. Als u wilt deelnemen aan de preview, moet u dit formulier invullen. Deze functie ondersteunt alleen het converteren van refererende tabellen die zijn gefedereerd met HMS en Glue Federation.

Op deze pagina wordt beschreven hoe u SET EXTERNAL gebruikt om een vreemde tabel naar een externe tabel te converteren.

overzicht van SET EXTERNAL

Gebruik de SET EXTERNAL functie om een refererende tabel te converteren naar een Unity Catalog-tabel EXTERNAL in Azure Databricks. SET EXTERNAL biedt de volgende voordelen:

  • Tabelgeschiedenis behouden
  • Dezelfde tabelconfiguraties behouden, inclusief dezelfde naam, instellingen, machtigingen en weergaven.

Vereiste voorwaarden

  • Gegevensindeling: de gegevensindeling van de buitenlandse tabel moet een van de volgende zijn:
    • Delta
    • Parquet
    • orc
    • Avro
    • JSON
    • CSV
    • Tekst
  • Tabeltype: Het type HMS-tabel moet een externe HMS-tabel zijn. De opdracht mislukt als de tabel een beheerde HMS-tabel is.
  • Runtime: Databricks Runtime 17.3 of hoger
  • Machtigingen: OWNER of MANAGE machtigingen voor de tabel en CREATE machtigingen voor de EXTERNAL LOCATION

Waarschuwing

Gelijktijdige schrijfbewerkingen naar de brontabel en vanuit Unity Catalog worden niet ondersteund. U bent verantwoordelijk voor het uitschakelen van lees- en schrijfbewerkingen naar de brontabel in de externe catalogus en ervoor zorgen dat workloads naar de nieuwe catalogus zijn gemigreerd voordat u de conversie uitvoert.

Syntaxis

Voer de volgende opdracht uit om uw vreemde Unity Catalog-tabel te converteren naar een externe Unity Catalog-tabel:

ALTER TABLE source_table SET EXTERNAL [DRY RUN]

Parameterwaarden

  • source_table

    Een bestaande externe tabel in Unity Catalog. nl-NL: Foreign tables bevatten gegevens en metagegevens die worden beheerd door een externe catalogus. Voordat u converteert, als u de brontabel in de externe catalogus verwijdert, wordt de vreemde tabel ook verwijderd in Unity Catalog. Nadat de tabel is geconverteerd naar extern, heeft het verwijderen van de brontabel in de externe catalogus geen invloed op de externe tabel van Unity Catalog.

  • DRY RUN

    Wanneer dit is opgegeven, controleert u of de brontabel kan worden bijgewerkt zonder de doeltabellen te upgraden. De opdracht retourneert DRY_RUN_SUCCESS als een tabel kan worden bijgewerkt.

Terugdraaien

Als u de tabelmigratie wilt terugdraaien, zet u de tabel neer en wordt deze opnieuw gefedereerd als extern in de volgende catalogussynchronisatie.

DROP TABLE catalog.schema.my_external_table;

Conversie controleren

U kunt bevestigen dat uw vreemde tabel is geconverteerd naar een externe tabel door te controleren in Catalog Explorer. Voor de conversie wordt de tabel weergegeven als Extern en na de conversie wordt deze weergegeven als Extern.

Opmerking

Als u de tabel uitvoert DESCRIBE EXTENDED , wordt het tabeltype weergegeven als zowel vóór als EXTERNAL na conversie. Dit komt door de werking van Federatie, omdat deze het gedrag van het uitvoeren van deze opdracht in de hive_metastore catalogus nabootst. Gebruik Catalog Explorer om de conversie nauwkeurig te controleren.

Veelgestelde vragen

Kan ik zowel tabellen maken als converteren in een externe catalogus?

Ja, u kunt externe of beheerde tabellen maken in een vreemde catalogus. Het gedrag is afhankelijk van de schemaconfiguratie:

  • Voor Lijm- of eHMS-schema's of voor schema's met een beheerde locatie die is ingesteld in Unity Catalog: Als u uitvoert CREATE TABLE foreign_catalog.schema.table, wordt hiermee een beheerde of externe tabel voor Unity Catalog gemaakt. De tabel wordt niet gepusht of gesynchroniseerd met de externe catalogus.
  • Voor schema's van interne Hive-metastoreverbindingen: als u probeert een tabel in een buitenlands schema te maken, wordt er nog steeds een buitenlandse tabel gemaakt en daarnaast ook een tabel in hive_metastore.
  • Voor de verouderde Hive-metastore van de werkruimte: Aangezien het een lees- en schrijffederatie betreft, wordt er ook een tabel gemaakt in de interne Hive-metastore als u een tabel in de externe catalogus maakt.

Wat als mijn externe tabellen in de SerDe-indeling zijn?

Voor Parquet SerDe-tabellen in AWS Glue moet u de metagegevens van de tabel wijzigen voordat u deze converteert naar een externe tabel. Het volgende Python-script maakt gebruik van de AWS boto3-bibliotheek om de benodigde eigenschappen bij te werken:

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!")

Wat als mijn externe tabellen worden ondersteund door DBFS?

Bij het converteren van een tabel met DBFS-ondersteuning slaan we de huidige toewijzing van het DBFS-pad naar het cloudpad op als de locatie van het cloudpad van de externe tabel.

Kan ik converteren op schema- of catalogusniveau?

U kunt uw tabellen in uw schema's herhalen om afzonderlijk te converteren of het discoverx labs-project gebruiken om hele schema's of catalogi tegelijk te converteren:

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