Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Viktigt!
Den här funktionen är i offentlig förhandsversion och är endast tillgänglig för deltagande kunder just nu. För att delta i förhandsvisningen, ansök genom att fylla i det här formuläret. Den här funktionen stöder endast konvertering av utländska tabeller som federerats med HMS och Glue Federation.
Den här sidan beskriver hur du använder SET EXTERNAL för att konvertera en sekundär tabell till en extern tabell.
- Mer information om hur du konverterar en sekundär tabell till en hanterad tabell finns i Konvertera en sekundär tabell till en hanterad Unity Catalog-tabell
- Mer information om hur du konverterar en extern tabell till en hanterad tabell finns i Konvertera en extern tabell till en hanterad Unity Catalog-tabell
SET EXTERNAL översikt
Använd funktionen SET EXTERNAL för att konvertera en sekundär tabell till en Unity Catalog-tabell EXTERNAL i Azure Databricks.
SET EXTERNAL erbjuder följande fördelar:
- Behålla tabellhistorik
- Behålla samma tabellkonfigurationer, inklusive samma namn, inställningar, behörigheter och vyer.
Förutsättningar
-
Dataformat: Den externa tabellens dataformat måste vara något av följande:
- Delta
- Parquet
- ORC
- Avro
- JSON
- CSV
- Textmeddelande
- Tabelltyp: HMS-tabelltypen måste vara en extern HMS-tabell. Kommandot misslyckas om tabellen är en hanterad HMS-tabell.
- Körmiljö: Databricks Runtime 17.3 eller senare
-
Behörigheter:
OWNERellerMANAGEbehörigheter i tabellen ochCREATEbehörigheten påEXTERNAL LOCATION
Varning
Samtidiga skrivningar till källtabellen och från Unity Catalog stöds inte. Du ansvarar för att inaktivera läsningar och skrivningar till källtabellen i den externa katalogen och se till att arbetsbelastningarna har migrerats till den nya katalogen innan konverteringen utförs.
Syntax
Om du vill konvertera den externa Unity Catalog-tabellen till Unity Catalog extern kör du följande kommando:
ALTER TABLE source_table SET EXTERNAL [DRY RUN]
Parameterar
source_table
En befintlig extern tabell i Unity Catalog. Utländska tabeller innehåller data och metadata som hanteras av en extern katalog. Om du släpper källtabellen i den externa katalogen tas även den externa tabellen bort i Unity Catalog innan konverteringen. När tabellen har konverterats till en extern tabell, påverkar det inte den externa tabellen i Unity Catalog om källtabellen tas bort från den externa katalogen.
DRY RUNNär du anger det kontrollerar du om källtabellen kan uppgraderas utan att uppgradera måltabellerna. Kommandot returnerar
DRY_RUN_SUCCESSom en tabell kan uppgraderas.
Tillbakagång
Om du vill återställa tabellmigreringen, ta bort tabellen, och den återförbinds som extern i nästa katalogsynkronisering.
DROP TABLE catalog.schema.my_external_table;
Kontrollera konvertering
Du kan bekräfta att din utländska tabell har konverterats till en extern tabell genom att kolla i Catalog Explorer. Före konverteringen visas tabellen som Främmande och efter konverteringen visas den som Extern.
Anmärkning
När du kör DESCRIBE EXTENDED visas tabelltypen som EXTERNAL både före och efter konverteringen. Detta beror på hur Federation fungerar eftersom den efterliknar beteendet att köra det här kommandot i hive_metastore katalogen. Om du vill verifiera konverteringen korrekt använder du Catalog Explorer.
Vanliga frågor
Kan jag skapa tabeller och konvertera tabeller i en utländsk katalog?
Ja, du kan skapa externa eller hanterade tabeller i en extern katalog. Beteendet beror på schemakonfigurationen:
-
För Glue- eller eHMS-scheman, eller för scheman med en hanterad plats som angetts i Unity Catalog: Om du kör
CREATE TABLE foreign_catalog.schema.table, skapar detta en hanterad eller extern Unity Catalog-tabell. Tabellen skickas inte eller synkroniseras inte till den externa katalogen. -
För scheman från interna Hive-metaarkivanslutningar: Om du försöker skapa en tabell i ett sekundärschema skapar den fortfarande en sekundär tabell och skapar även en tabell i
hive_metastore. - För Hive-metastore för äldre arbetsytor: Eftersom det är läs- och skrivfederation skapas även en tabell i den interna Hive-metastore om du skapar en tabell i en extern katalog.
Vad händer om mina externa tabeller är i SerDe-format?
För Parquet SerDe-tabeller i AWS Glue måste du ändra tabellmetadata innan du konverterar till en extern tabell. Följande Python-skript använder AWS boto3-biblioteket för att uppdatera de nödvändiga egenskaperna:
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!")
Vad händer om mina utländska tabeller stödjs av DBFS?
När vi konverterar en DBFS-stödd tabell lagrar vi den aktuella mappningen av DBFS-sökvägen till molnsökvägen som den externa tabellens molnsökvägsläge.
Kan jag konvertera på schema- eller katalognivå?
Du kan iterera genom dina tabeller i dina scheman för att konvertera individuellt, eller använda projektet discoverx labs för att konvertera hela scheman eller kataloger på en gång:
df = (dx.from_tables("prod.*.*")
.with_sql("ALTER TABLE {full_table_name} SET EXTERNAL;")
.apply()) # dry run with .explain()