Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penting
Fitur ini ada di Pratinjau Umum dan hanya tersedia untuk pelanggan yang berpartisipasi saat ini. Untuk berpartisipasi dalam pratinjau, daftarkan diri Anda dengan mengisi formulir ini. Fitur ini hanya mendukung konversi tabel asing yang difederasi menggunakan HMS dan Glue Federation.
Halaman ini menjelaskan cara menggunakan SET EXTERNAL untuk mengonversi tabel asing ke tabel eksternal.
- Untuk detail tentang mengonversi tabel asing ke tabel terkelola, lihat Mengonversi tabel asing ke tabel Katalog Unity terkelola
- Untuk detail tentang mengonversi tabel eksternal ke tabel terkelola, lihat Mengonversi tabel eksternal ke tabel Katalog Unity terkelola
gambaran umum SET EXTERNAL
SET EXTERNAL Gunakan fitur untuk mengonversi tabel asing ke tabel Unity Catalog EXTERNAL di Azure Databricks.
SET EXTERNAL menawarkan manfaat berikut:
- Mempertahankan riwayat tabel
- Mempertahankan konfigurasi tabel yang sama, termasuk nama, pengaturan, izin, dan tampilan yang sama.
Prasyarat
-
Format data: Format data tabel asing harus salah satu dari yang berikut ini:
- Delta
- Parquet
- ORC
- Avro
- JSON
- CSV
- TEKS
- Jenis tabel: Jenis tabel HMS harus berupa tabel HMS eksternal. Perintah gagal jika tabel adalah tabel HMS terkelola.
- Runtime: Databricks Runtime 17.3 atau lebih tinggi
-
Izin:
OWNERatauMANAGEizin pada tabel danCREATEizin padaEXTERNAL LOCATION
Peringatan
Penulisan secara bersamaan pada tabel sumber dan dari Unity Catalog tidak didukung. Anda bertanggung jawab untuk menonaktifkan baca dan tulis ke tabel sumber di katalog eksternal dan memastikan bahwa beban kerja telah bermigrasi ke katalog baru sebelum melakukan konversi.
Syntax
Untuk mengonversi tabel asing Unity Catalog Anda menjadi Unity Catalog eksternal, jalankan perintah berikut:
ALTER TABLE source_table SET EXTERNAL [DRY RUN]
Parameter-parameternya
source_table
Tabel asing yang ada di Katalog Unity. Tabel asing berisi data dan metadata yang dikelola oleh katalog eksternal. Sebelum konversi, jika Anda menghilangkan tabel sumber di katalog eksternal, tabel asing juga dihilangkan di Katalog Unity. Setelah tabel dikonversi ke eksternal, menghilangkan tabel sumber di katalog eksternal tidak memengaruhi tabel eksternal Katalog Unity.
DRY RUNKetika ditentukan, memeriksa apakah tabel sumber dapat ditingkatkan tanpa meningkatkan tabel target. Perintah ini mengembalikan
DRY_RUN_SUCCESSjika tabel dapat di-upgrade.
Rollback
Untuk mengembalikan migrasi tabel, hapus tabel tersebut dan kemudian difederasikan kembali sebagai tabel asing dalam sinkronisasi direktori berikutnya.
DROP TABLE catalog.schema.my_external_table;
Periksa konversi
Anda dapat mengonfirmasi bahwa tabel asing Anda telah dikonversi ke tabel eksternal dengan memeriksa di Catalog Explorer. Sebelum konversi, tabel ditampilkan sebagai Asing, dan setelah konversi ditampilkan sebagai Eksternal.
Nota
Menjalankan DESCRIBE EXTENDED memperlihatkan jenis tabel seperti EXTERNAL sebelum dan sesudah konversi. Hal ini disebabkan oleh cara kerja Federasi, karena meniru perilaku saat menjalankan perintah ini pada hive_metastore katalog. Untuk memverifikasi konversi secara akurat, gunakan Catalog Explorer.
FAQ
Bisakah saya membuat tabel serta mengonversi tabel dalam katalog asing?
Ya, Anda dapat membuat tabel eksternal atau terkelola di katalog asing. Perilaku tergantung pada konfigurasi skema:
-
Untuk skema Glue atau eHMS, atau untuk skema dengan lokasi yang diatur dalam Unity Catalog: Jika Anda menjalankan
CREATE TABLE foreign_catalog.schema.table, ini akan membuat tabel terkelola dalam Unity Catalog atau tabel eksternal. Tabel tidak dipindahkan atau disinkronkan ke katalog luar. -
Untuk skema dari koneksi metastore Apache Hive internal: Jika Anda mencoba membuat tabel dalam skema asing, skema tersebut masih membuat tabel asing dan juga membuat tabel di
hive_metastore. - Untuk metastore Hive ruang kerja lama: Karena ini adalah federasi baca dan tulis, jika Anda membuat tabel di katalog asing, tabel tersebut juga akan dibuat di metastore Hive internal.
Bagaimana jika tabel asing saya dalam format SerDe?
Untuk tabel Parquet SerDe di AWS Glue, Anda harus memodifikasi metadata tabel sebelum mengonversi ke tabel eksternal. Skrip Python berikut menggunakan pustaka boto3 AWS untuk memperbarui properti yang diperlukan:
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!")
Bagaimana jika tabel eksternal saya berbasis DBFS?
Saat mengonversi tabel yang didukung DBFS, kami menyimpan pemetaan jalur DBFS saat ini ke jalur cloud sebagai lokasi jalur cloud tabel eksternal.
Dapatkah saya mengonversi pada tingkat skema atau katalog?
Anda dapat melakukan iterasi melalui tabel dalam skema untuk dikonversi satu per satu, atau menggunakan proyek lab discoverx untuk mengonversi seluruh skema atau katalog sekaligus:
df = (dx.from_tables("prod.*.*")
.with_sql("ALTER TABLE {full_table_name} SET EXTERNAL;")
.apply()) # dry run with .explain()