Tüm Ürünler
Search
Belge Merkezi

MaxCompute:CREATE TABLE

Son Güncelleme:Oct 04, 2026

CREATE TABLE ifadesi, bölümlenmemiş, bölümlenmiş, harici veya küme tabanlı tablolar oluşturur.

Sınırlamalar

  • Bölümlenmiş bir tabloda en fazla 6 bölüm düzeyi bulunabilir. Örneğin, tarihe göre bölümlenmiş bir tabloda year/month/week/day/hour/minute düzeyleri kullanılabilir.

  • Varsayılan olarak bir tabloda en fazla 60.000 bölüm bulunabilir. Bu sınır proje bazında yapılandırılabilir.

Diğer tablo sınırlamaları için bkz. SQL sınırlamaları.

Söz dizimi

Dahili tablo

Dahili tablo oluşturma (bölümlenmemiş veya bölümlenmiş)

CREATE [OR REPLACE] TABLE [IF NOT EXISTS] <table_name> (
<col_name> <data_type>, ... )
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type> [COMMENT <col_comment>], ...)]
[AUTO PARTITIONED 
   BY (<auto_partition_expression> [AS <auto_partition_column_name>])
  [TBLPROPERTIES('ingestion_time_partition'='true')]
];

Küme tabanlı tablo

Küme tabanlı tablo oluşturma

CREATE TABLE [IF NOT EXISTS] <table_name> (
<col_name> <data_type>, ... )
[CLUSTERED BY | RANGE CLUSTERED BY (<col_name> [, <col_name>, ...]) 
[SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])] 
INTO <number_of_buckets> BUCKETS];

Harici tablo

Harici tablo oluşturma

Bu örnekte yerleşik metin veri ayrıştırıcısı kullanılarak bir OSS harici tablosu oluşturulur. Diğer biçimler ORC harici tablosu bölümünde ele alınmıştır.

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> ( 
<col_name> <data_type>, ... ) 
STORED AS '<file_format>' 
[WITH SERDEPROPERTIES (options)]  
LOCATION '<oss_location>';

İşlemsel ve Delta tabloları

  • İşlemsel bir tablo oluşturur. Bu tür bir tabloda UPDATE veya DELETE işlemlerini çalıştırabilirsiniz. Ancak işlemsel tabloların sınırlamaları vardır.

    CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> (
    <col_name <data_type> [NOT NULL] [DEFAULT <default_value>] [COMMENT <col_comment>], ...   
    [COMMENT <table_comment>]
    [TBLPROPERTIES ("transactional"="true")];
  • Delta tablosu oluşturur. Birincil anahtarla birlikte kullanıldığında upsert işlemleri, artımlı sorgular ve zaman yolculuğu gibi işlemler yapabilirsiniz.

    CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> (
    <col_name <data_type> [NOT NULL] [DEFAULT <default_value>] [COMMENT <col_comment>], ...   
    [PRIMARY KEY (<pk_col_name>[, <pk_col_name2>, ...] )]) 
    [COMMENT <table_comment>]
    [CLUSTERED BY (<pk_col_name>[, <pk_col_name2>, ...] )]
    [TBLPROPERTIES ("transactional"="true" 
    [, "write.bucket.num" = "N", "acid.data.retain.hours"="hours"...])] [LIFECYCLE <days>];
    • Birincil anahtarı olan bir Delta tablosunda, birincil anahtarın alt kümesini karma kümeleme anahtarı olarak kullanabilirsiniz.

      Birincil anahtarı olan bir Delta tablosunda sistem varsayılan olarak tüm birincil anahtarı kümeleme anahtarı olarak kullanarak karma kümelemeyi uygular. Sorgular sıkça birincil anahtar sütunlarının alt kümesine göre filtreleme yapıyorsa, filtreleme performansını artırmak amacıyla bu alt kümeyi açıkça kümeleme anahtarı olarak belirtin.

    • Kümeleme anahtarını açıkça belirtirseniz sistem tablo verilerini belirtilen sütunlara göre karma paketlere dağıtır. Kümeleme anahtarı, birincil anahtar sütunlarının bir alt kümesi olmalıdır.

      Kümeleme anahtarını açıkça belirtmezseniz sistem varsayılan kümeleme anahtarı olarak tüm birincil anahtar sütunlarını kullanır.

      Tablo oluşturulduktan sonra kümeleme anahtarını değiştiremezsiniz. Tabloyu oluştururken bunu belirtmeniz gerekir.

CTAS ve LIKE yan tümceleri

  • Mevcut bir tabloyu temel alarak yeni bir tablo oluşturur ve verileri kopyalar ancak bölüm özelliklerini kopyalamaz. Bu yan tümce harici tablolara ve harici Lakehouse projelerindeki tablolara uygulanır.

    CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>;
  • Mevcut bir tabloyla aynı yapıya sahip yeni bir tablo oluşturur ancak verileri kopyalamaz. Bu yan tümce harici tablolara ve harici Lakehouse projelerindeki tablolara uygulanır.

    CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] LIKE <existing_table_name>;

Parametreler

Ortak parametreler

Genel parametreler

Parametre

Gerekli mi?

Açıklama

Açıklamalar

OR REPLACE

Hayır

  • Aynı ada sahip bir tablo varsa silinir ve yeni tablo ile değiştirilir.

  • CREATE OR REPLACE TABLE aşağıdaki yan tümcelerle kullanılamaz:

    • CREATE TABLE ... IF NOT EXISTS

Bu, aşağıdaki komutları çalıştırmaya eşdeğerdir:

DROP TABLE IF EXISTS <tableName>;  -- If the table exists, drop it.
CREATE TABLE <tableName> ...;      -- Create the new table.

EXTERNAL

Hayır

Harici bir tablo oluşturur.

Yok

IF NOT EXISTS

Hayır

Aynı ada sahip bir tablo zaten yoksa tablo oluşturur.

IF NOT EXISTS olmadan yinelenen adlı bir tablo oluşturulduğunda hata döner. IF NOT EXISTS ile ifade, farklı şemaya sahip aynı adlı bir tablo mevcut olsa bile başarılı olur. Mevcut tablonun meta verileri değişmez.

table_name

Evet

Tablonun adı.

Tablo adı 128 bayt veya daha kısa olmalı ve yalnızca harfler, rakamlar ve alt çizgi (_) içermelidir. Büyük/küçük harfe duyarlı değildir. Adın bir harfle başlaması önerilir.

PRIMARY KEY(pk)

Hayır

Tablonun birincil anahtarı.

Sütun kombinasyonunun benzersizliğini sağlamak için bir veya daha fazla sütunu birincil anahtar olarak tanımlayın. Standart SQL birincil anahtar söz dizimini izler. Birincil anahtar sütunları NOT NULL olarak ayarlanmalıdır ve değiştirilemez.

Önemli

Bu parametre yalnızca Delta Tablosu için geçerlidir.

col_name

Evet

Sütunun adı.

  • Sütun adı 128 bayt veya daha kısa olmalı ve yalnızca harfler, rakamlar, alt çizgi (_) veya Çince karakterler içermelidir. Büyük/küçük harfe duyarlı değildir. Adın bir harfle başlaması önerilir.

  • BigQuery uyumluluk modunu etkinleştirmek için SET odps.sql.bigquery.compatible=true; komutunu çalıştırın. Bu modda sütun adı uzunluğu en fazla 256 bayt olabilir. Aksi takdirde hata döner.

col_comment

Hayır

Sütun açıklaması.

1.024 bayt veya daha kısa bir dize olmalıdır.

data_type

Evet

Sütunun veri türü.

Desteklenen türler: BIGINT, DOUBLE, BOOLEAN, DATETIME, DECIMAL, STRING ve Veri türleri bölümünde listelenen diğerleri.

NOT NULL

Hayır

Sütunun NULL değer içeremeyeceğini belirtir.

NOT NULL özelliğinin nasıl değiştirileceği hakkında daha fazla bilgi için bkz. Bölüm işlemleri.

default_value

Hayır

Sütun için varsayılan değer.

Bir insert işlemi bu sütun için bir değer belirtmezse varsayılan değer sütuna yazılır.

Not

GETDATE() ve NOW() gibi işlevler varsayılan değer olarak desteklenmez.

table_comment

Hayır

Tablo açıklaması.

1.024 bayt veya daha kısa bir dize olmalıdır.

LIFECYCLE

Hayır

Tablonun yaşam döngüsü (gün cinsinden).

Yalnızca pozitif tamsayılar desteklenir. Birim gündür.

  • Bölümlenmemiş bir tablo için yaşam döngüsü son veri değiştirme zamanından başlar. Veriler belirtilen gün sayısı boyunca değiştirilmezse MaxCompute tabloyu otomatik olarak geri alır; bu durum DROP TABLE işlemine eşdeğerdir.

  • Bölümlenmiş bir tablo için sistem bir bölümün geri alınıp alınmayacağını LastModifiedTime değerine göre belirler. Bölümlenmemiş tablolardan farklı olarak son bölüm geri alındıktan sonra tablo kendisi silinmez. Yaşam döngüsü yalnızca tablo düzeyinde ayarlanabilir, bölüm düzeyinde ayarlanamaz.

Bölümlenmiş tablolar

Bölümlenmiş tablo parametreleri

Bölümlenmiş tablo parametreleri

MaxCompute standart ve otomatik bölümlenmiş tabloları destekler. Bölüm sütunlarının nasıl oluşturulduğuna bağlı olarak seçim yapın. Bölümlenmiş tabloya genel bakış.

Standart bölümlenmiş tablo parametreleri

Parametre

Gerekli mi?

Açıklama

Açıklamalar

PARTITIONED BY

Evet

Standart bölümlenmiş bir tablo için bölümleri belirtir.

Bölümleri PARTITIONED BY veya AUTO PARTITIONED BY kullanarak belirtebilirsiniz ancak ikisini aynı anda kullanamazsınız.

col_name

Evet

Bölüm sütununun adı.

  • Sütun adı 128 bayt veya daha kısa olmalı ve yalnızca harfler, rakamlar, alt çizgi (_) veya Çince karakterler içermelidir. Büyük/küçük harfe duyarlı değildir. Adın bir harfle başlaması önerilir.

  • BigQuery uyumluluk modunu etkinleştirmek için SET odps.sql.bigquery.compatible=true; komutunu çalıştırın. Bu modda sütun adı uzunluğu en fazla 256 bayt olabilir. Aksi takdirde hata döner.

data_type

Evet

Bölüm sütununun veri türü.

MaxCompute V1.0 yalnızca STRING türünü destekler. V2.0 TINYINT, SMALLINT, INT, BIGINT ve VARCHAR türlerini ekler (STRING desteklenmeye devam eder). Tam liste için bkz. Veri türleri. Bölümleme, bölüm düzeyindeki işlemler için tam tablo taramalarını ortadan kaldırır.

col_comment

Hayır

Bölüm sütunu açıklaması.

1.024 bayt veya daha kısa bir dize olmalıdır.

Not

Bir bölüm değeri 255 bayt veya daha kısa olmalıdır. Çince karakterler gibi çift baytlı karakterler içeremez. Değer bir harfle başlamalı ve yalnızca harfler, rakamlar ve şu karakterleri içermelidir: boşluk, iki nokta (:), alt çizgi (_), dolar işareti ($), diyez (#), nokta (.), ünlem işareti (!) ve at işareti (@). Kaçış karakterleri \t, \n ve / gibi diğer karakterlerin davranışı tanımsızdır.

Otomatik bölümlenmiş tablo parametreleri

Otomatik bölümlenmiş tablo, bölüm sütunlarını otomatik olarak oluşturur. Kullanım ayrıntıları için bkz. Bölümlenmiş tablo türleri.


Parametre


Gerekli mi?


Açıklama


Açıklamalar


AUTO PARTITIONED BY


Evet


Otomatik bölümlenmiş bir tablo için bölümleri belirtir.


Bölümleri PARTITIONED BY veya AUTO PARTITIONED BY kullanarak belirtebilirsiniz ancak ikisini aynı anda kullanamazsınız.


auto_partition_expression


Evet

Bölüm sütununun nasıl hesaplandığını tanımlayan ifade.

Şu anda bölüm sütunu oluşturmak için yalnızca TRUNC_TIME işlevi kullanılabilir. Yalnızca bir bölüm sütunu desteklenir.

TRUNC_TIME işlevi, belirtilen zaman birimine göre bir tarih veya saat türündeki sütundan verileri keserek bölüm sütunu oluşturabilir.


auto_partition_column_name


Hayır

Oluşturulan bölüm sütununun adı.

Bir ad belirtilmezse sistem varsayılan ad olarak _pt_col_0_ kullanır. Bu ad zaten kullanılıyorsa sistem kullanılmayan bir ad bulunana kadar soneki artırır (örneğin _pt_col_1_ veya _pt_col_2_).


Bölüm ifadesinden yapılan hesaplamaya dayalı olarak STRING türünde bir bölüm sütunu oluşturulur. Bu sütun için açıkça bir ad belirtebilirsiniz ancak veri türünü veya değerini doğrudan değiştiremezsiniz.


TBLPROPERTIES('ingestion_time_partition'='true')


Hayır


Bölüm sütunlarının veri alım zamanına göre oluşturulup oluşturulmayacağını belirtir.


Alım zamanı bölümleme şu konuda açıklanmıştır: Veri alım zamanına dayalı otomatik bölümlenmiş tablolar.

Küme tabanlı tablolar

Küme tabanlı tablo parametreleri

Küme tabanlı tablolar karma küme tabanlı ve aralık küme tabanlı olarak kategorize edilir.

Karma küme tabanlı tablo


Parametre


Gerekli mi?


Açıklama


Açıklamalar


CLUSTERED BY


Evet


Karma anahtarını belirtir. MaxCompute belirtilen sütunlar için karma değerlerini hesaplar ve bu değerlere göre verileri karma paketlerine dağıtır.


Veri eğrilmesini önlemek ve iyi paralellik elde etmek için CLUSTERED BY yan tümcesi için yüksek kardinaliteye ve az yinelemeye sahip sütunları seçin. join optimizasyonu için sık kullanılan join veya toplama anahtarlarını seçin.


SORTED BY


Evet


Her bir karma paketi içindeki sütunların sıralama düzenini belirtir.


En iyi performans için SORTED BY ve CLUSTERED BY için aynı sütunları kullanın. SORTED BY yan tümcesini belirttiğinizde MaxCompute otomatik olarak bir dizin oluşturur ve bunu sorguları hızlandırmak için kullanır.


number_of_buckets


Evet


Karma paketlerinin sayısını belirtir.


Bu değer gereklidir ve değeri veri hacmine bağlıdır.

Not

Karma paketi sayısını seçerken şu iki ilkeyi izleyin:

  • Karma paketi boyutunu makul tutun: Her bir karma paketi için önerilen boyut yaklaşık 500 MB'dır. Örneğin, tahmini bölüm boyutu 500 GB ise paket sayısını 1.000 olarak ayarlayın. Bu durumda ortalama karma paketi boyutu yaklaşık 500 MB olur. Çok büyük tablolar için 500 MB sınırını aşabilirsiniz. Paket başına 2 GB ila 3 GB boyut uygundur.

  • join işlemlerini optimize etmek için karıştırma ve sıralama adımlarını kaldırmak performansı önemli ölçüde artırır. Bunun için iki tablodaki karma paketi sayılarının birbirinin katı olması gerekir (örneğin 256 ve 512). Karma paketi sayısının 2'nin kuvveti (2n) şeklinde ayarlanması önerilir (örneğin 512, 1024, 2048 veya 4096). Bu, sistemin karma paketlerini otomatik olarak bölüp birleştirerek karıştırma ve sıralama adımlarını kaldırmasına ve yürütme verimliliğini artırmasına olanak tanır.

Aralık küme tabanlı tablo


Parametre


Gerekli mi?


Açıklama


Açıklamalar


RANGE CLUSTERED BY


Evet


Aralık küme sütunlarını belirtir.


MaxCompute belirtilen sütunlarda paketleme işlemleri gerçekleştirir ve verileri paket numaralarına göre dağıtır.


SORTED BY


Evet


Her bir paket içindeki sütunların sıralama düzenini belirtir.


Kullanımı karma küme tabanlı tablo ile aynıdır.


number_of_buckets


Evet


Paket sayısını belirtir.


Aralık küme tabanlı tablo için karma küme tabanlı tablolarda geçerli olan 2'nin kuvveti (2n) en iyi uygulaması gerekli değildir. Veriler eşit dağıtılıyorsa herhangi bir paket sayısı kabul edilebilir. Bu parametre aralık küme tabanlı tablolar için isteğe bağlıdır. Atlanırsa sistem veri hacmine göre optimum paket sayısını otomatik olarak belirler.

Bir aralık küme tabanlı tabloda join veya toplama işlemi gerçekleştirildiğinde, join anahtarı veya grup anahtarı aralık kümeleme anahtarı veya bunun öneki ise veri yeniden dağıtımını (shuffle remove) ortadan kaldırarak performansı artırabilirsiniz. Bu özelliği etkinleştirmek veya devre dışı bırakmak için set odps.optimizer.enable.range.partial.repartitioning=true/false; komutunu çalıştırabilirsiniz. Varsayılan olarak devre dışıdır.

Not
  • Küme tabanlı tabloların avantajları:

    • Optimize edilmiş paket budama

    • Optimize edilmiş toplamalar

    • Optimize edilmiş depolama

  • Küme tabanlı tabloların sınırlamaları:

    • INSERT INTO desteklenmez. Verileri yalnızca INSERT OVERWRITE kullanarak ekleyebilirsiniz.

    • Tunnel aracılığıyla aralık küme tabanlı bir tabloya doğrudan veri yüklenmesi desteklenmez çünkü Tunnel verileri sırasız şekilde yükler.

    • Yedekleme ve kurtarma özellikleri desteklenmez.

Harici tablolar

Harici tablo parametreleri

Bu bölüm OSS harici tablo parametrelerini kapsar. Diğer harici tablo türleri Harici tablolar bölümünde belgelendirilmiştir.


Parametre


Gerekli mi?


Açıklama


STORED AS '<file_format>'


Evet


Harici tablonun veri biçimine göre file_format değerini belirtir.


WITH SERDEPROPERTIES(options)


Hayır


Harici tablo için yetkilendirme, sıkıştırma ve karakter ayrıştırma ile ilgili parametreleri belirtir.


oss_location


Evet


Harici tablo verilerinin OSS depolama konumu. Daha fazla bilgi için bkz. OSS harici tabloları.

İşlemsel ve Delta tabloları

İşlemsel Tablo ve Delta Tablosu parametreleri

Delta Tablosu parametreleri

Delta Tablosu neredeyse gerçek zamanlı okuma ve yazmayı, artımlı depolama ve erişimi ve gerçek zamanlı güncellemeleri destekleyen bir tablo biçimidir. Şu anda yalnızca birincil anahtar tabloları desteklenmektedir.

Parametre

Gerekli mi?

Açıklama

Açıklamalar

PRIMARY KEY(PK)

Evet

Birden fazla sütun içerebilen Delta Tablosu için birincil anahtarı tanımlar.

Söz dizimi standart SQL birincil anahtar söz dizimini izler. Birincil anahtar sütunları NOT NULL olarak ayarlanmalıdır ve değiştirilemez. Birincil anahtar ayarlandıktan sonra veriler birincil anahtar sütunlarına göre yinelenmeden arındırılır. Benzersizlik kısıtlaması tek bir bölüm içinde veya bölümlenmemiş bir tablo içinde uygulanır.

transactional

Evet

Delta Tablosu oluşturmak için gereklidir. Bu parametreyi true olarak ayarlamanız gerekir.

Tablonun MaxCompute ACID tablolarının işlemsel özelliklerini desteklediğini gösterir. Tablo anlık görüntü yalıtım düzeyini sağlamak için Çok Sürümlü Eşzamanlılık Kontrolü (MVCC) modelini kullanır.

write.bucket.num

Hayır

Varsayılan değer 16'dır. Geçerli aralık (0, 4096].

Her bir bölüm veya bölümlenmemiş tablo için paket sayısını belirtir. Bu aynı zamanda veri yazma işlemleri için eşzamanlı düğüm sayısını da gösterir. Bölümlenmiş bir tablo için bu parametreyi değiştirebilirsiniz ve yeni ayar yeni bölümler için geçerli olur. Bölümlenmemiş bir tablo için bu parametreyi değiştiremezsiniz. Aşağıdaki önerileri dikkate alın:

  • Verileri Tunnel kullanarak içeri aktarıyorsanız bu parametre eşzamanlı Tunnel düğümü sayısını belirtir. Ayar, içeri aktarma trafiğini etkiler ve ayrıca maksimum eşzamanlı Tunnel düğümü sayısı tarafından kısıtlanır.

  • Verileri SQL kullanarak yazıyorsanız bu parametre indirgeyicilerin eşzamanlılık derecesini belirtir. Bu, maksimum eşzamanlı indirgeyici düğüm sayısı tarafından kısıtlanır.

  • Her bir paket için önerilen boyut yaklaşık 500 MB veridir. Örneğin, tahmini bölüm boyutu 500 GB ise paket sayısını 1.000 olarak ayarlayın. Çok büyük tablolar için paket boyutunu 2 GB ila 3 GB'a çıkarabilirsiniz.

acid.data.retain.hours

Hayır

Varsayılan değer 24'tür. Geçerli aralık [24, 168].

Zaman Yolculuğu kullanarak geçmiş veri durumlarını sorgulayabileceğiniz saat cinsinden zaman aralığını belirtir. 168 saatten (7 gün) daha uzun bir Zaman Yolculuğu geçmişine ihtiyacınız varsa MaxCompute teknik desteğine başvurun.

  • 0 değeri, geçmiş veri durumunun saklanmadığını ve Zaman Yolculuğu sorgularının desteklenmediğini gösterir.

  • Belirtilen değerden daha eski geçmiş veriler silinebilir veya sıkıştırılabilir.

  • Bir Zaman Yolculuğu sorgusu bu parametre tarafından tanımlanan izin verilen aralıktan daha erken bir zaman belirtirse hata döner. Örneğin, bu değer 72 ise 72 saatten daha önceki veriler için yapılan sorgu başarısız olur.

acid.incremental.query.out.of.time.range.enabled

Hayır

Varsayılan değer: false.

true ise artımlı sorgudaki endTimestamp tablonun en son veri işleme zamanından sonraki bir zaman olabilir. Bu durumda yeni veri eklenebileceğinden birden çok sorgu farklı sonuçlar döndürebilir. Bu parametrenin değerini mevcut bir tablo için değiştirebilirsiniz.

acid.write.precombine.field

Hayır

Tek bir sütun adı belirtir.

Bir sütun adı belirtilirse sistem aynı işleme içindeki verileri yinelenmeden arındırmak için bu sütunu birincil anahtar sütunlarıyla birlikte kullanır. Bu, veri benzersizliğini ve tutarlılığını sağlar.

Not

Tek bir veri işleme 128 MB'yi aşarsa birden çok dosya oluşturulur. Bu parametre birden çok dosya arasında geçerli değildir.

acid.partial.fields.update.enable

Hayır

true olarak ayarlanırsa Delta Tablosunda SQL veya Tunnel kullanarak kısmi sütun güncelleme yapabilirsiniz.

Bu parametre tablo oluşturulurken ayarlanır. Tablo oluşturulduktan sonra değiştirilemez.

  • Delta Tabloları için diğer parametre gereksinimleri:

    • LIFECYCLE: Tablo yaşam döngüsü zaman yolculuğu saklama süresinden büyük veya buna eşit olmalıdır; yani lifecycle >= acid.data.retain.hours / 24. Tablo oluşturulurken kontrol yapılır ve bu koşul karşılanmazsa hata raporlanır.

    • Desteklenmeyen özellikler: CLUSTERED BY, EXTERNAL ve CREATE TABLE AS desteklenmez.

  • Diğer sınırlamalar:

    • Şu anda diğer motorlar doğrudan Delta Tablosu üzerinde işlem gerçekleştiremez. Yalnızca MaxCompute SQL desteklenir.

    • Standart bir tabloyu Delta Tablosuna dönüştüremezsiniz.

    • Delta Tablosunun birincil anahtar sütunlarında şema değişiklikleri gerçekleştiremezsiniz.

İşlemsel Tablo parametreleri


Parametre


Gerekli mi?


Açıklama


TBLPROPERTIES("transactional"="true")


Evet


Tabloyu İşlemsel Tablo olarak ayarlar ve satır düzeyinde update ve delete işlemlerini etkinleştirir. Verileri güncelleme veya silme (UPDATE | DELETE).

İşlemsel Tablo için aşağıdaki sınırlamalar geçerlidir:

  • transactional özelliğini yalnızca tablo oluştururken ayarlayabilirsiniz. Mevcut bir tablo için bu özelliği değiştirmek üzere ALTER TABLE kullanamazsınız. Aşağıdaki ifade hata döndürür:

    ALTER TABLE not_txn_tbl SET TBLPROPERTIES("transactional"="true");
    -- Error returned.
    FAILED: Catalog Service Failed, ErrorCode: 151, Error Message: Set transactional is not supported
  • Küme tabanlı bir tabloyu veya harici bir tabloyu İşlemsel Tablo olarak ayarlayamazsınız.

  • Standart dahili tabloyu, harici tabloyu veya küme tabanlı tabloyu İşlemsel Tabloya veya tersine dönüştüremezsiniz.

  • Otomatik sıkıştırma desteklenmez. Dosyaları şu konuda açıklandığı gibi manuel olarak sıkıştırın: İşlemsel Tabloda dosyaları sıkıştırma.

  • merge partition işlemi desteklenmez.

  • İşlemsel Tablolara diğer sistemlerden erişim sınırlıdır. Örneğin MaxCompute Graph okuma veya yazma işlemlerini desteklemez. Spark ve PAI yalnızca okuma işlemlerini destekler.

  • Önemli verilerde update, delete veya insert overwrite işlemlerini gerçekleştirmeden önce SELECT ... INSERT ifadesini kullanarak verileri başka bir tabloya manuel olarak yedekleyin.

Mevcut tablolardan tablo oluşturma

Tablo oluşturma (mevcuttan)

  • CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>; ifadesini kullanarak başka bir tablo oluşturabilir ve aynı anda verileri yeni tabloya kopyalayabilirsiniz.

    • Bu ifade bölüm özelliklerini kopyalamaz. Kaynak tablonun bölüm sütunları hedef tabloda normal sütun olarak değerlendirilir. Kaynak tablonun yaşam döngüsü özelliği de kopyalanmaz.

    • lifecycle parametresini kullanarak yeni tablo için bir yaşam döngüsü belirtebilirsiniz. Bu ifade ayrıca dahili bir tablo oluşturmayı ve harici bir tablodan veri kopyalamayı destekler.

  • CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] LIKE <existing_table_name>; ifadesini kullanarak mevcut bir tabloyla aynı şemaya sahip yeni bir tablo oluşturabilirsiniz.

    • Bu ifade şemayı kopyalar ancak kaynak tablodan verileri veya yaşam döngüsü özelliğini kopyalamaz.

    • lifecycle parametresini kullanarak yeni tablo için bir yaşam döngüsü belirtebilirsiniz. Bu ifade ayrıca harici bir tablonun şemasını kopyalayan dahili bir tablo oluşturmayı destekler.

Örnekler

Bölümlenmemiş tablo

  • Bölümlenmemiş bir tablo oluşturun.

    CREATE TABLE test1 (key STRING);
  • Bölümlenmemiş bir tablo oluşturun ve sütunlar için varsayılan değerler belirtin.

    CREATE TABLE test_default( 
    tinyint_name tinyint NOT NULL default 1Y,
    smallint_name SMALLINT NOT NULL DEFAULT 1S,
    int_name INT NOT NULL DEFAULT 1,
    bigint_name BIGINT NOT NULL DEFAULT 1,
    binary_name BINARY ,
    float_name FLOAT ,
    double_name DOUBLE NOT NULL DEFAULT 0.1,
    decimal_name DECIMAL(2, 1) NOT NULL DEFAULT 0.0BD,
    varchar_name VARCHAR(10) ,
    char_name CHAR(2) ,
    string_name STRING NOT NULL DEFAULT 'N',
    boolean_name BOOLEAN NOT NULL DEFAULT TRUE
    );

Bölümlenmiş tablo

  • Standart bölümlenmiş bir tablo oluşturun.

    CREATE TABLE IF NOT EXISTS sale_detail(
     shop_name     STRING,
     customer_id   STRING,
     total_price   DOUBLE)
    PARTITIONED BY (sale_date STRING, region STRING);
  • Zaman işlevi kullanarak zamana dayalı bir veri sütununa göre bölümler oluşturan AUTO PARTITION bölümlenmiş bir tablo oluşturun.

    -- The sale_date column is truncated by month to generate a partition column named sale_month. The table is then partitioned by this column.
    CREATE TABLE IF NOT EXISTS auto_sale_detail(
     shop_name     STRING,
     customer_id   STRING,
     total_price   DOUBLE,
     sale_date    DATE )
    AUTO PARTITIONED BY (TRUNC_TIME(sale_date, 'month') AS sale_month);
  • Veri alım zamanına göre bölümler oluşturan AUTO PARTITION bölümlenmiş bir tablo oluşturun. Sistem verilerin MaxCompute'a yazıldığı zamanı otomatik olarak alır ve bir zaman işlevi kullanarak bölümler oluşturur.

    -- After the table is created, when data is written, the system automatically captures the data ingestion time (_partitiontime), truncates it by day, generates a partition column named sale_date, and then partitions the table by this column.
    CREATE TABLE IF NOT EXISTS auto_sale_detail2(
     shop_name     STRING,
     customer_id   STRING,
     total_price   DOUBLE,
     _partitiontime TIMESTAMP_NTZ)
    AUTO PARTITIONED BY (TRUNC_TIME(_partitiontime, 'day') AS sale_date)
    TBLPROPERTIES('ingestion_time_partition'='true');

Karma veya aralık küme tabanlı tablo

  • Karma küme tabanlı bölümlenmemiş bir tablo oluşturun.

    CREATE TABLE t1 (a STRING, b STRING, c BIGINT) CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;
  • Karma küme tabanlı bölümlenmiş bir tablo oluşturun.

    CREATE TABLE t2 (a STRING, b STRING, c BIGINT) 
    PARTITIONED BY (dt STRING) CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;
  • Aralık küme tabanlı bölümlenmemiş bir tablo oluşturun.

    CREATE TABLE t3 (a STRING, b STRING, c BIGINT) RANGE CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;
  • Aralık küme tabanlı bölümlenmiş bir tablo oluşturun.

    CREATE TABLE t4 (a STRING, b STRING, c BIGINT) 
    PARTITIONED BY (dt STRING) RANGE CLUSTERED BY (c) SORTED BY (c); 

İşlemsel tablo

  • Bölümlenmemiş işlemsel bir tablo oluşturun.

    CREATE TABLE t5(id BIGINT) TBLPROPERTIES ("transactional"="true");
  • Bölümlenmiş işlemsel bir tablo oluşturun.

    CREATE TABLE IF NOT EXISTS t6(id BIGINT) 
    PARTITIONED BY (ds STRING) TBLPROPERTIES ("transactional"="true");

Dahili tablo

  • Harici bölümlenmiş bir tablodan veri kopyalayarak dahili bir tablo oluşturun. Dahili tablo bölüm özelliklerini içermez.

    1. Bir OSS harici tablosu ve bir MaxCompute dahili tablosu oluşturun. CREATE TABLE AS kullanarak dahili bir tablo oluşturun.

      -- Create an OSS external table and insert data into it.
      CREATE EXTERNAL TABLE max_oss_test(a INT, b INT, c INT) 
      STORED AS TEXTFILE
      LOCATION "oss://oss-cn-hangzhou-internal.aliyuncs.com/<bucket_name>";
      
      INSERT INTO max_oss_test VALUES 
      (101, 1, 20241108),
      (102, 2, 20241109),
      (103, 3, 20241110);
      
      SELECT * FROM max_oss_test;
      
      -- Result
      a    b    c
      101    1    20241108
      102    2    20241109
      103    3    20241110
      
      -- Create an internal table by using CREATE TABLE AS.
      CREATE TABLE from_exetbl_oss AS SELECT * FROM max_oss_test;
      
      -- Query the new internal table.
      SELECT * FROM from_exetbl_oss;
      
      -- The result shows that all data is copied.
      a    b    c
      101    1    20241108
      102    2    20241109
      103    3    20241110
    2. Dahili tablonun şemasını görüntülemek için DESC from_exetbl_oss; komutunu çalıştırın. Komut aşağıdaki çıktıyı döndürür.

      +------------------------------------------------------------------------------------+
      | Owner:                    ALIYUN$***********                                       |
      | Project:                  ***_*****_***                                            |
      | TableComment:                                                                      |
      +------------------------------------------------------------------------------------+
      | CreateTime:               2023-01-10 15:16:33                                      |
      | LastDDLTime:              2023-01-10 15:16:33                                      |
      | LastModifiedTime:         2023-01-10 15:16:33                                      |
      +------------------------------------------------------------------------------------+
      | InternalTable: YES      | Size: 919                                                |
      +------------------------------------------------------------------------------------+
      | Native Columns:                                                                    |
      +------------------------------------------------------------------------------------+
      | Field           | Type       | Label | Comment                                     |
      +------------------------------------------------------------------------------------+
      | a               | string     |       |                                             |
      | b               | string     |       |                                             |
      | c               | string     |       |                                             |
      +------------------------------------------------------------------------------------+
  • Harici bölümlenmiş bir tablodan şema kopyalayarak dahili bir tablo oluşturun. Dahili tablo bölüm özelliklerini içerir.

    1. from_exetbl_like dahili tablosunu oluşturun. OSS harici tablosunu MaxCompute üzerinden sorgulayın. CREATE TABLE LIKE kullanarak dahili bir tablo oluşturun.

      -- Query the OSS external table from MaxCompute.
      SELECT * FROM max_oss_test;
      -- Result
      a    b    c
      101    1    20241108
      102    2    20241109
      103    3    20241110
      
      -- Create an internal table by using CREATE TABLE LIKE.
      CREATE TABLE from_exetbl_like LIKE max_oss_test;
      
      -- Query the new internal table.
      SELECT * FROM from_exetbl_like;
      -- Result: Only the table schema is returned.
      a    b    c
    2. Dahili tablonun şemasını görüntülemek için DESC from_exetbl_like; komutunu çalıştırın. Komut aşağıdaki çıktıyı döndürür.

      +------------------------------------------------------------------------------------+
      | Owner:                    ALIYUN$************                                      |
      | Project:                  ***_*****_***                                            |
      | TableComment:                                                                      |
      +------------------------------------------------------------------------------------+
      | CreateTime:               2023-01-10 15:09:47                                      |
      | LastDDLTime:              2023-01-10 15:09:47                                      |
      | LastModifiedTime:         2023-01-10 15:09:47                                      |
      +------------------------------------------------------------------------------------+
      | InternalTable: YES      | Size: 0                                                  |
      +------------------------------------------------------------------------------------+
      | Native Columns:                                                                    |
      +------------------------------------------------------------------------------------+
      | Field           | Type       | Label | Comment                                     |
      +------------------------------------------------------------------------------------+
      | a               | string     |       |                                             |
      | b               | string     |       |                                             |
      +------------------------------------------------------------------------------------+
      | Partition Columns:                                                                 |
      +------------------------------------------------------------------------------------+
      | c               | string     |                                                     |
      +------------------------------------------------------------------------------------+

Delta tablosu

  • Delta tablosu oluşturun.

    CREATE TABLE mf_tt (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT) 
      TBLPROPERTIES ("transactional"="true");
  • Delta tablosu oluşturun ve temel tablo özelliklerini ayarlayın.

    CREATE TABLE mf_tt2 ( 
      pk BIGINT NOT NULL, 
      pk2 BIGINT NOT NULL, 
      val BIGINT, 
      val2 BIGINT, 
      PRIMARY KEY (pk, pk2)
    ) 
    TBLPROPERTIES (
      "transactional"="true", 
      "write.bucket.num" = "64", 
      "acid.data.retain.hours"="120"
    ) LIFECYCLE 7;

Diğer yöntemler

Mevcut tabloyu değiştirme

  1. Orijinal tablo my_table öğesini oluşturun ve içine veri ekleyin.

    CREATE OR REPLACE TABLE my_table(a BIGINT);
    
    INSERT INTO my_table(a) VALUES (1),(2),(3);
  2. Aynı ada sahip yeni bir tablo oluşturmak ve sütunlarını değiştirmek için OR REPLACE kullanın.

    CREATE OR REPLACE TABLE my_table(b STRING);
  3. my_table tablosunu sorgulayın. Sorgu aşağıdaki sonucu döndürür.

    +------------+
    | b          | 
    +------------+
    +------------+

    Aşağıdaki SQL ifadeleri geçersizdir:

    CREATE OR REPLACE TABLE IF NOT EXISTS my_table(b STRING);
    CREATE OR REPLACE TABLE my_table AS SELECT;
    CREATE OR REPLACE TABLE my_table LIKE newtable;

Verileri kopyalama ve yaşam döngüsü ayarlama

-- Create a new table named sale_detail_ctas1, copy the data from sale_detail to it, and set a lifecycle.
SET odps.sql.allow.fullscan=true;
CREATE TABLE sale_detail_ctas1 LIFECYCLE 10 AS SELECT * FROM sale_detail;

Tablonun şeması ve yaşam döngüsü gibi ayrıntıları görüntülemek için DESC EXTENDED sale_detail_ctas1; komutunu çalıştırın.

Not

Bu örnekte sale_detail bölümlenmiş bir tablodur. sale_detail_ctas1 tablosunu oluşturmak için CREATE TABLE ... AS select_statement ... ifadesini kullandığınızda bölüm özellikleri kopyalanmaz. Kaynak tablodaki bölüm sütunları hedef tabloda normal sütun haline gelir. Bu nedenle sale_detail_ctas1 beş sütunlu bölümlenmemiş bir tablodur.

Sütun değerleri için sabitler kullanma

Not

SELECT yan tümcesinde sütun değerleri olarak sabitler kullanıyorsanız sütun adlarını belirtin. Aksi takdirde oluşturulan sale_detail_ctas3 tablosundaki dördüncü ve beşinci sütunlar _c4 ve _c5 gibi varsayılan adlar alır.

  • Sütun adlarını belirtin.

    SET odps.sql.allow.fullscan=true;
    CREATE TABLE sale_detail_ctas2
    AS
    SELECT shop_name, customer_id, total_price, '2013' AS sale_date, 'China' AS region
    FROM sale_detail;
  • Sütun adlarını belirtmeyin.

    SET odps.sql.allow.fullscan=true;
    
    CREATE TABLE sale_detail_ctas3
    AS
    SELECT shop_name, customer_id, total_price, '2013', 'China' 
    FROM sale_detail;

Şema kopyalama ve yaşam döngüsü ayarlama

CREATE TABLE sale_detail_like LIKE sale_detail LIFECYCLE 10;

Tablonun şeması ve yaşam döngüsü gibi ayrıntıları görüntülemek için DESC EXTENDED sale_detail_like; komutunu çalıştırın.

Not

sale_detail_like şeması sale_detail şemasıyla aynıdır. Sütun adları, sütun açıklamaları ve tablo açıklamaları gibi tüm özellikler yaşam döngüsü özelliği hariç kopyalanır. Ancak sale_detail içindeki veriler sale_detail_like tablosuna kopyalanmaz.

Harici tablodan şema kopyalama

-- Create a new table named mc_oss_extable_orc_like that has the same schema as the external table mc_oss_extable_orc.
CREATE TABLE mc_oss_extable_orc_like LIKE mc_oss_extable_orc;

Tablonun şeması gibi ayrıntıları görüntülemek için DESC mc_oss_extable_orc_like; komutunu çalıştırın.

+------------------------------------------------------------------------------------+
| Owner: ALIYUN$****@***.aliyunid.com | Project: max_compute_7u************yoq              |
| TableComment:                                                                      |
+------------------------------------------------------------------------------------+
| CreateTime:               2022-08-11 11:10:47                                      |
| LastDDLTime:              2022-08-11 11:10:47                                      |
| LastModifiedTime:         2022-08-11 11:10:47                                      |
+------------------------------------------------------------------------------------+
| InternalTable: YES      | Size: 0                                                  |
+------------------------------------------------------------------------------------+
| Native Columns:                                                                    |
+------------------------------------------------------------------------------------+
| Field           | Type       | Label | Comment                                     |
+------------------------------------------------------------------------------------+
| id              | string     |       |                                             |
| name            | string     |       |                                             |
+------------------------------------------------------------------------------------+

Yeni veri türleri

SET odps.sql.type.system.odps2=true;
CREATE TABLE test_newtype (
    c1 TINYINT,
    c2 SMALLINT,
    c3 INT,
    c4 BIGINT,
    c5 FLOAT,
    c6 DOUBLE,
    c7 DECIMAL,
    c8 BINARY,
    c9 TIMESTAMP,
    c10 ARRAY<MAP<BIGINT,BIGINT>>,
    c11 MAP<STRING,ARRAY<BIGINT>>,
    c12 STRUCT<s1:STRING,s2:BIGINT>,
    c13 VARCHAR(20))
LIFECYCLE 1;

İlgili komutlar

  • ALTER TABLE: Bir tablonun yapısını veya özelliklerini değiştirir.

  • TRUNCATE TABLE: Bir tablodaki tüm verileri kaldırır.

  • DROP TABLE: Bir tabloyu siler.

  • DESC TABLE/VIEW: MaxCompute dahili tablosu, görünümü, materyalize edilmiş görünümü, harici tablosu, küme tabanlı tablosu veya İşlemsel tablosu hakkında bilgi görüntüler.

  • SHOW: Bir tablo için SQL DDL ifadesini, bir projedeki tüm tabloları ve görünümleri veya bir tablodaki tüm bölümleri görüntüler.