Freigeben über


Konvertieren einer Fremdtabelle in eine externe Unity-Katalogtabelle

Von Bedeutung

Dieses Feature befindet sich in der öffentlichen Vorschau und ist derzeit nur für teilnehmende Kunden verfügbar. Um an der Vorschau teilzunehmen, wenden Sie sich an, indem Sie dieses Formular ausfüllen. Dieses Feature unterstützt nur das Konvertieren fremder Tabellen, die mit HMS und Glue Federation verbunden sind.

Auf dieser Seite wird beschrieben, wie Sie SET EXTERNAL verwenden, um eine Fremdtabelle in eine externe Tabelle zu konvertieren.

Übersicht SET EXTERNAL

Verwenden Sie das SET EXTERNAL Feature, um eine Fremdtabelle in eine Unity-Katalogtabelle EXTERNAL in Azure Databricks zu konvertieren. SET EXTERNAL bietet die folgenden Vorteile:

  • Tabellenhistorie beibehalten
  • Beibehalten der gleichen Tabellenkonfigurationen, einschließlich desselben Namens, der Einstellungen, Berechtigungen und Ansichten.

Voraussetzungen

  • Datenformat: Das Datenformat der Fremdtabelle muss eine der folgenden Sein:
    • Delta
    • Parquet
    • ORC
    • Avro
    • JSON
    • CSV-Datei
    • TEXT
  • Tabellentyp: Der HMS-Tabellentyp muss eine externe HMS-Tabelle sein. Der Befehl schlägt fehl, wenn die Tabelle eine verwaltete HMS-Tabelle ist.
  • Laufzeit: Databricks Runtime 17.3 oder höher
  • Berechtigungen: OWNER oder MANAGE Berechtigungen für die Tabelle und CREATE Berechtigung für die EXTERNAL LOCATION

Warnung

Gleichzeitige Schreibvorgänge in die Quelltabelle und aus dem Unity-Katalog werden nicht unterstützt. Sie sind dafür verantwortlich, Lese- und Schreibvorgänge in die Quelltabelle im externen Katalog zu deaktivieren und sicherzustellen, dass Arbeitslasten vor der Konvertierung in den neuen Katalog migriert wurden.

Syntax

Führen Sie den folgenden Befehl aus, um die Fremdtabelle des Unity-Katalogs als externen Unity-Katalog zu konvertieren:

ALTER TABLE source_table SET EXTERNAL [DRY RUN]

Die Parameter

  • source_table

    Eine vorhandene Fremdtabelle im Unity-Katalog. Fremdtabellen enthalten Daten und Metadaten, die von einem externen Katalog verwaltet werden. Vor der Konvertierung wird die Fremdtabelle auch im Unity-Katalog abgelegt, wenn Sie die Quelltabelle im externen Katalog ablegen. Nachdem die Tabelle in eine externe Tabelle konvertiert wurde, wirkt sich das Ablegen der Quelltabelle im externen Katalog nicht auf die externe Tabelle des Unity-Katalogs aus.

  • DRY RUN

    Wenn angegeben, überprüft, ob die Quelltabelle aktualisiert werden kann, ohne die Zieltabellen zu aktualisieren. Der Befehl gibt DRY_RUN_SUCCESS zurück, wenn eine Tabelle aktualisiert werden kann.

Rollback

Um das Rollback der Tabellenmigration durchzuführen, löschen Sie die Tabelle, und sie wird dann in der nächsten Katalogsynchronisierung als Fremdtabelle eingebunden.

DROP TABLE catalog.schema.my_external_table;

Konvertierung überprüfen

Sie können bestätigen, dass Ihre Fremdtabelle in eine externe Tabelle konvertiert wurde, indem Sie den Katalog-Explorer einchecken. Vor der Konvertierung wird die Tabelle als "Fremd" und nach der Konvertierung als "Extern" angezeigt.

Hinweis

Durch Ausführen von DESCRIBE EXTENDED wird der Tabellentyp sowohl vor als auch nach der Konvertierung als EXTERNAL angezeigt. Dies liegt daran, wie Der Verbund funktioniert, da es das Verhalten des Ausführens dieses Befehls im hive_metastore Katalog nachahmt. Verwenden Sie den Katalog-Explorer, um die Konvertierung genau zu überprüfen.

Häufig gestellte Fragen

Kann ich Tabellen erstellen und Tabellen in einem fremdkatalog konvertieren?

Ja, Sie können externe oder verwaltete Tabellen in einem fremden Katalog erstellen. Das Verhalten hängt von der Schemakonfiguration ab:

  • Für Glue- oder eHMS-Schemas oder für Schemas mit einem verwalteten Speicherort im Unity-Katalog: Wenn Sie ausführen CREATE TABLE foreign_catalog.schema.table, erstellt dies eine verwaltete oder externe Tabelle im Unity-Katalog. Die Tabelle wird nicht mit dem externen Katalog verschoben oder synchronisiert.
  • Für Schemas aus internen Hive-Metaspeicherverbindungen: Wenn Sie versuchen, eine Tabelle in einem fremdschema zu erstellen, erstellt sie weiterhin eine Fremdtabelle und erstellt auch eine Tabelle in hive_metastore.
  • Für den Legacy-Arbeitsbereich Hive-Metaspeicher: Da es sich um einen Lese- und Schreibverbund handelt, wird automatisch auch eine Tabelle im internen Hive-Metaspeicher erstellt, wenn Sie eine Tabelle im fremden Katalog erstellen.

Was geschieht, wenn meine Fremdtabellen im SerDe-Format vorliegen?

Für Parquet SerDe-Tabellen in AWS Glue müssen Sie die Tabellenmetadaten ändern, bevor Sie sie in eine externe Tabelle umwandeln. Das folgende Python-Skript verwendet die AWS Boto3-Bibliothek, um die erforderlichen Eigenschaften zu aktualisieren:

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

Was geschieht, falls meine Fremdtabellen von DBFS unterstützt werden?

Beim Konvertieren einer DBFS-unterstützten Tabelle speichern wir die aktuelle Abbildung des DBFS-Pfads zum Cloud-Pfad als Speicherort des Cloud-Pfads der externen Tabelle.

Kann ich auf Schema- oder Katalogebene konvertieren?

Sie können Ihre Tabellen in Ihren Schemas durchlaufen, um einzeln zu konvertieren, oder das Discoverx Labs-Projekt verwenden, um ganze Schemas oder Kataloge gleichzeitig zu konvertieren:

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