Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
- Ausführliche Informationen zum Konvertieren einer Fremdtabelle in eine verwaltete Tabelle finden Sie unter Konvertieren einer Fremdtabelle in eine verwaltete Unity-Katalogtabelle
- Ausführliche Informationen zum Konvertieren einer externen Tabelle in eine verwaltete Tabelle finden Sie unter Konvertieren einer externen Tabelle in eine verwaltete Unity-Katalogtabelle
Ü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:
OWNERoderMANAGEBerechtigungen für die Tabelle undCREATEBerechtigung für dieEXTERNAL 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 RUNWenn angegeben, überprüft, ob die Quelltabelle aktualisiert werden kann, ohne die Zieltabellen zu aktualisieren. Der Befehl gibt
DRY_RUN_SUCCESSzurü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()