Aracılığıyla paylaş


Yabancı tabloyu dış Unity Kataloğu tablosuna dönüştürme

Önemli

Bu özellik Genel Önizleme aşamasındadır ve şu anda yalnızca katılan müşteriler tarafından kullanılabilir. Önizlemeye katılmak için bu formu doldurarak başvurun. Bu özellik yalnızca HMS ve Tutkal Federasyonu kullanılarak birleştirilmiş yabancı tabloların dönüştürülmesini destekler.

Bu sayfada, yabancı tabloyu dış tabloya dönüştürmek için nasıl kullanılacağı SET EXTERNAL açıklanmaktadır.

SET EXTERNAL genel bakış

Azure Databricks'te SET EXTERNAL yabancı bir tabloyu Unity Kataloğu EXTERNAL tablosuna dönüştürmek için özelliğini kullanın. SET EXTERNAL aşağıdaki avantajları sunar:

  • Tablo geçmişini koruma
  • Aynı ad, ayarlar, izinler ve görünümler de dahil olmak üzere aynı tablo yapılandırmalarını koruma.

Önkoşullar

  • Veri biçimi: Yabancı tablonun veri biçimi aşağıdakilerden biri olmalıdır:
    • Delta
    • Parquet
    • ORC
    • Avro
    • JSON
    • CSV
    • METİN
  • Tablo türü: HMS tablo türü bir dış HMS tablosu olmalıdır. Tablo yönetilen bir HMS tablosuysa komut başarısız olur.
  • Çalışma Zamanı: Databricks Runtime 17.3 veya üzeri
  • İzinler: OWNER veya MANAGE tablo üzerindeki izinler ve CREATEEXTERNAL LOCATION üzerindeki izinler

Uyarı

Kaynak tabloya ve Unity Kataloğu'ndan eşzamanlı yazma işlemleri desteklenmez. Dış katalogdaki kaynak tabloya okuma ve yazma işlemlerini devre dışı bırakmak ve dönüştürmeyi gerçekleştirmeden önce iş yüklerinin yeni kataloğa geçirildiğinden emin olmak sizin sorumluluğunuzdadır.

Sözdizimi

Unity Kataloğu yabancı tablonuzu Unity Kataloğu dış tablosuna dönüştürmek için aşağıdaki komutu çalıştırın:

ALTER TABLE source_table SET EXTERNAL [DRY RUN]

Parametreler

  • source_table

    Unity Kataloğu'nda var olan bir harici tablo. Yabancı tablolar, dış katalog tarafından yönetilen verileri ve meta verileri içerir. Dönüştürmeden önce, kaynak tabloyu dış kataloğa bırakırsanız, yabancı tablo Unity Kataloğu'nda da bırakılır. Tablo dış tabloya dönüştürüldükten sonra, dış katalogdaki kaynak tablo silinse bile, Unity Kataloğundaki dış tablo etkilenmez.

  • DRY RUN

    Belirtildiğinde, hedef tabloları yükseltmeden kaynak tablonun yükseltilip yükseltilemeyeceğini denetler. Bir tablo yükseltilebiliyorsa komut döndürür DRY_RUN_SUCCESS .

Geri dönüş

Tablo geçişini geri almak için tabloyu silin; ardından bir sonraki katalog eşitlemesinde yabancı tablo olarak yeniden federasyon olarak ayarlanır.

DROP TABLE catalog.schema.my_external_table;

Dönüştürmeyi denetleme

Katalog Gezgini'ne bakarak yabancı tablonuzun dış tabloya dönüştürüldüğünü onaylayabilirsiniz. Dönüştürmeden önce tablo Yabancı olarak, dönüştürmeden sonra ise Dış olarak gösterilir.

Uyarı

Çalıştırma DESCRIBE EXTENDED, dönüşümden önce ve sonra tablo türünü EXTERNAL olarak gösterir. Bunun nedeni, bu komutu katalogda hive_metastore çalıştırma davranışını taklit eden Federasyon'un çalışma biçimidir. Dönüştürmeyi doğru bir şekilde doğrulamak için Katalog Gezgini'ni kullanın.

FAQ

Tabloları oluşturabilir ve yabancı katalogdaki tabloları dönüştürebilir miyim?

Evet, bir yabancı katalogda dış veya yönetilen tablolar oluşturabilirsiniz. Davranış şema yapılandırmasına bağlıdır:

  • Tutkal veya eHMS şemaları ya da Unity Kataloğu'nda yönetilen konuma sahip şemalar için: CREATE TABLE foreign_catalog.schema.table çalıştırıldığında, bir Unity Kataloğu içinde yönetilen veya harici bir tablo oluşturur. Tablo dış kataloğa gönderilmez veya senkronize edilmez.
  • İç Hive meta veri deposu bağlantılarındaki şemalar için: Yabancı bir şemada tablo oluşturmaya çalışırsanız, yabancı bir tablo oluşturur ve hive_metastoreda da bir tablo oluşturur.
  • Eski çalışma alanı Hive meta veri deposu için: Okuma ve yazma federasyon modeli olduğundan, yabancı katalogda bir tablo oluşturursanız, dahili Hive meta veri deposunda da bir tablo oluşturur.

Eğer yabancı tablolarım SerDe formatındaysa, ne olur?

AWS Glue'daki Parquet SerDe tabloları için, dış tabloya dönüştürmeden önce tablo meta verilerini değiştirmeniz gerekir. Aşağıdaki Python betiği, gerekli özellikleri güncelleştirmek için AWS boto3 kitaplığını kullanır:

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

Yabancı tablolarım DBFS destekliyse ne olur?

DBFS destekli tabloyu dönüştürürken, DBFS yolunun bulut yoluna geçerli eşlemesini dış tablonun bulut yolu konumu olarak depolarız.

Şema veya katalog düzeyinde dönüştürebilir miyim?

Şemalarınızdaki tabloları tek tek dönüştürmek için yineleyebilir veya discoverx labs projesini kullanarak şemaların veya katalogların tamamını aynı anda dönüştürebilirsiniz:

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