Mevcut bir tablonun yapısını, özelliklerini veya bölümlerini değiştirir.
Kullanım notları
Şema evrimi; karmaşık veri türlerine sahip sütun ekleme, sütun silme, sütunları yeniden sıralama ve sütun veri türlerini değiştirme gibi işlemleri kapsar. Sütunları yeniden sıraladığınızda, sütun ekleyip ardından yeniden sıraladığınızda veya sütun sildiğinizde tablonun okuma ve yazma davranışı etkilenir ve aşağıdaki sınırlamalar geçerli olur:
İş tipi MapReduce 1.0 ise Graph görevleri değiştirilen tablodan veri okuyamaz veya tabloya veri yazamaz.
-
CUPID işleri için yalnızca aşağıdaki Spark sürümleri tablodan veri okuyabilir. Tabloya veri yazamazsınız.
Spark-2.3.0-odps0.34.0
Spark-3.1.1-odps0.34.0
PAI işleri tablodan veri okuyabilir ancak tabloya veri yazamaz.
Hologres işleri için 1,3'ten önceki bir Hologres sürümü kullanıyorsanız değiştirilen tabloyu yabancı tablo olarak referans aldığınızda tablodan okuma veya tabloya yazma işlemi yapamazsınız.
Şema evriminden sonra CLONE TABLE desteklenmez.
Şema evrimi gerçekleştiyse Streaming Tunnel hata bildirir.
Tablo sahibini değiştirin
ALTER TABLE <table_name> changeowner TO <new_owner>;
Parametreler:
|
|
|
|
|
|
|
|
|
|
|
|
Örnek:
-- Transfer ownership of the test1 table to ALIYUN$xxx@aliyun.com.
ALTER TABLE test1 changeowner TO 'ALIYUN$xxx@aliyun.com';
Tablo açıklamasını değiştirin
ALTER TABLE <table_name> SET COMMENT '<new_comment>';
Parametreler:
|
|
|
|
|
|
|
|
|
|
|
|
Örnek:
ALTER TABLE sale_detail SET COMMENT 'new comments for table sale_detail';
Güncellenen açıklamayı doğrulamak için DESC <table_name> komutunu çalıştırın.
Bir tablonun LastModifiedTime değerini güncelleyin
touch işlemi LastModifiedTime değerini geçerli zamana ayarlar; bu da tablo için yaşam döngüsü hesaplamasını yeniden başlatır.
ALTER TABLE <table_name> touch;
Örnek:
ALTER TABLE sale_detail touch;
Bir tablonun kümeleme özelliklerini değiştirin
Bölümlendirilmiş bir tablo için kümeleme özellikleri ekler veya kaldırır.
Kümeleme özellikleri yalnızca bölümlendirilmiş tablolar için değiştirilebilir. Bölümlendirilmemiş tablolar oluşturulduktan sonra kümeleme özelliklerini değiştiremez. Değişiklik yalnızca yeni bölümleri (INSERT OVERWRITE ile oluşturulanlar dahil) etkiler. Eski bölümler özgün kümeleme özelliklerini korur. Bu ifade yalnızca yeni bölümleri etkilediğinden bu ifadede bir bölüm belirtemezsiniz.
Sözdizimi:
-- Add hash cluster properties.
ALTER TABLE <table_name> [clustered BY (<col_name> [, <col_name>, ...]) [sorted BY (<col_name> [ASC | DESC]
[, <col_name> [ASC | DESC] ...])] INTO <number_of_buckets> buckets];
-- Remove hash or range cluster properties from a table.
ALTER TABLE <table_name> NOT clustered;
-- Add range cluster properties (bucket count is optional; the system auto-determines the optimal count).
ALTER TABLE <table_name> [RANGE clustered BY (<col_name> [, <col_name>, ...]) [sorted BY (<col_name> [ASC | DESC]
[, <col_name> [ASC | DESC] ...])] INTO <number_of_buckets> buckets];
-- Remove range cluster properties from a partition or a table.
ALTER TABLE <table_name> NOT clustered;
ALTER TABLE <table_name> PARTITION [<pt_spec>] NOT clustered;
Parametreler CREATE TABLE içindekilerle aynıdır.
Örnek:
-- Create a partitioned table.
CREATE TABLE IF NOT EXISTS sale_detail(
shop_name STRING,
customer_id STRING,
total_price DOUBLE)
PARTITIONED BY (sale_date STRING, region STRING);
-- Add hash cluster properties. New partitions are stored with these settings.
ALTER TABLE sale_detail clustered BY (customer_id) sorted BY (customer_id) INTO 10 buckets;
Kümeleme türleriyle ilgili ayrıntılar için bkz. Hash Clustering ve Range clustering.
PK Delta Table özelliklerini değiştirin
-- Update the bucket count for a partitioned PK Delta Table.
ALTER TABLE <table_name> SET tblproperties("write.bucket.num"="64");
-- Update the bucket count for a non-partitioned PK Delta Table.-- Existing data is redistributed based on the new bucket count.
ALTER TABLE <table_name> REWRITE tblproperties("write.bucket.num"="128");
-- Update the retain property: the time range (in hours) for Time Travel queries.
ALTER TABLE <table_name> SET tblproperties("acid.data.retain.hours"="60");
Bir tabloyu yeniden adlandırın
Verileri değiştirmeden bir tabloyu yeniden adlandırır.
ALTER TABLE <table_name> RENAME TO <new_table_name>;
Parametreler:
|
|
|
|
|
|
|
|
|
|
|
|
Örnek:
ALTER TABLE sale_detail RENAME TO sale_detail_rename;
Yaşam döngüsü süresini değiştirin
Mevcut bölümlendirilmiş veya bölümlendirilmemiş bir tablonun yaşam döngüsü süresini değiştirir.
ALTER TABLE <table_name> SET LIFECYCLE <days>;
Parametreler:
|
|
|
|
|
|
|
|
|
|
|
|
Örnek:
-- Modify the lifecycle of sale_detail_rename to 50 days.
ALTER TABLE sale_detail_rename SET LIFECYCLE 50;
Yaşam döngüsünü etkinleştirin veya devre dışı bırakın
Bir tablo veya belirli bir bölüm için yaşam döngüsünü etkinleştirir veya devre dışı bırakır.
ALTER TABLE <table_name> PARTITION [<pt_spec>] {enable|disable} LIFECYCLE;
Parametreler:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Örnekler:
-- Example 1: Disable the lifecycle for the sale_detail_rename table.
ALTER TABLE sale_detail_rename disable LIFECYCLE;
-- Example 2: Add test partitions.
ALTER TABLE sale_detail_rename ADD IF NOT EXISTSPARTITION (sale_date='201910', region='shanghai') PARTITION (sale_date='201911', region='shanghai')
PARTITION (sale_date='201912', region='shanghai') PARTITION (sale_date='202001', region='shanghai')
PARTITION (sale_date='202002', region='shanghai') PARTITION (sale_date='201910', region='beijing')
PARTITION (sale_date='201911', region='beijing') PARTITION (sale_date='201912', region='beijing')
PARTITION (sale_date='202001', region='beijing') PARTITION (sale_date='202002', region='beijing');
-- Disable the lifecycle for a single partition.
ALTER TABLE sale_detail_rename PARTITION (sale_date='201912', region='shanghai') disable LIFECYCLE;
Bölüm ekleyin
Mevcut bölümlendirilmiş bir tabloya bir veya daha fazla bölüm ekleyin.
Kullanım notları
Çok düzeyli bölümlendirilmiş bir tablo için bölüm eklerken tüm bölüm anahtarı sütunlarının değerlerini belirtin.
Bu işlem yalnızca bölüm değerlerini ekler. Bölüm anahtarı sütunları eklemez.
Sözdizimi
ALTER TABLE <table_name> ADD [IF NOT EXISTS] PARTITION <pt_spec> [PARTITION <pt_spec> PARTITION <pt_spec>...];
Parametreler
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Örnekler
Aşağıdaki örneklerde sale_detail adlı bölümlendirilmiş bir tablo kullanılmaktadır. Bu tabloyu oluşturmak için bkz. Tabloları oluşturma ve silme.
CREATE TABLE IF NOT EXISTS sale_detail(
shop_name STRING,
customer_id STRING,
total_price DOUBLE)
PARTITIONED BY (sale_date STRING, region STRING);
-
Tek bir bölüm ekleyin
Aralık 2025 için Hangzhou bölgesine ait bir bölüm ekleyin.
ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='202512', region='hangzhou'); -
Birden çok bölümü aynı anda ekleyin
Aralık 2025 için Pekin ve Şanghay bölgelerine ait iki bölüm ekleyin.
ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='202512', region='beijing') PARTITION (sale_date='202512', region='shanghai'); -
Eksik bölüm belirtimi (hata)
Çok düzeyli bir bölüm anahtarının yalnızca bir kısmını belirtmek hata döndürür. Hem
sale_datehem deregiongereklidir.ALTER TABLE sale_detail ADD IF NOT EXISTS PARTITION (sale_date='20260111'); -- Error returned: -- FAILED: ODPS-0130071:[1,58] Semantic analysis exception - provided partition spec does not match table partition spec -
Delta Table'a bölüm ekleyin
-- Create a Delta Table. CREATE TABLE delta_table_test_par ( pk BIGINT NOT NULL PRIMARY KEY, val BIGINT NOT NULL) PARTITIONED BY (dd STRING, hh STRING) TBLPROPERTIES ("transactional"="true"); -- Add a partition. ALTER TABLE delta_table_test_par ADD PARTITION (dd='01', hh='01'); CREATE TABLE delta_table_test_nonpar ( pk BIGINT NOT NULL PRIMARY KEY, val BIGINT NOT NULL) TBLPROPERTIES ("transactional"="true"); -
PK Delta Table özelliklerini değiştirin
-- Update the number of buckets for a partitioned PK Delta Table. ALTER TABLE delta_table_test_par SET TBLPROPERTIES("write.bucket.num"="64"); -- Update the number of buckets for a non-partitioned PK Delta Table. -- After the update, historical data is redistributed based on the new bucket count. ALTER TABLE delta_table_test_nonpar REWRITE TBLPROPERTIES("write.bucket.num"="128"); -- Update the retain property. This property specifies the number of hours -- for querying historical data states via Time Travel. ALTER TABLE delta_table_test_par SET TBLPROPERTIES("acid.data.retain.hours"="60");
Bölümleri ekledikten sonra SHOW PARTITIONS ile doğrulayın. Bkz. Tüm bölümleri listeleme.
Bölüm güncelleme saatini değiştirin
touch işlemi bir bölümün LastModifiedTime değerini geçerli zamana sıfırlar ve yaşam döngüsü yeniden hesaplamasını tetikler.
Kullanım notları
Çok düzeyli bölümlendirilmiş bir tablo için tüm bölüm anahtarı sütunlarının değerlerini belirtin.
Sözdizimi
ALTER TABLE <table_name> TOUCH PARTITION (<pt_spec>);
Parametreler
|
|
|
|
|
|
|
|
|
|
|
|
Örnekler
-- Update the LastModifiedTime of a specific partition in the sale_detail table.
ALTER TABLE sale_detail TOUCH PARTITION (sale_date='202512', region='shanghai');
Bölüm değerini değiştirin
RENAME mevcut bir bölümün değerlerini değiştirir.
Kullanım notları
Bu işlem yalnızca bölüm değerlerini değiştirir. Bölüm anahtarı sütunlarını yeniden adlandırmaz.
Çok düzeyli bölümlendirilmiş bir tablo için tüm bölüm anahtarı sütunlarının değerlerini belirtin.
Sözdizimi
ALTER TABLE <table_name> PARTITION (<pt_spec>) RENAME TO PARTITION (<new_pt_spec>);
Parametreler
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Örnekler
-- Rename a partition in the sale_detail table.
ALTER TABLE sale_detail PARTITION (sale_date = '201312', region = 'hangzhou') RENAME TO PARTITION (sale_date = '201310', region = 'beijing');
Bölümleri birleştirin
MERGE PARTITION birden çok bölümü tek bir hedef bölümde birleştirir. Veriler hedefe taşınır ve kaynak bölümler silinir.
Kullanım notları
Yabancı tablolar desteklenmez.
Kümelenmiş bir tablonun bölümlerini birleştirmek sonuçta oluşan bölümden kümelemeyi kaldırır.
Bir seferde en fazla 4.000 bölüm birleştirilebilir.
Sözdizimi
ALTER TABLE <table_name> MERGE [IF EXISTS] PARTITION (<predicate>) [, PARTITION(<predicate2>) ...] OVERWRITE PARTITION (<fullpartitionSpec>) [PURGE];
Parametreler
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Örnekler
Koşula göre bölümleri birleştirin
-- View current partitions.
SHOW PARTITIONS sale_detail;
-- Sample result:
-- sale_date=202512/region=beijing
-- sale_date=202512/region=shanghai
-- sale_date=202602/region=beijing
-- Merge all partitions where sale_date='202512' into a single destination partition.
ALTER TABLE sale_detail MERGE PARTITION(sale_date='202512') OVERWRITE PARTITION(sale_date='202601', region='hangzhou');
-- View partitions after the merge.
SHOW PARTITIONS sale_detail;
-- Sample result:
-- sale_date=202601/region=hangzhou
-- sale_date=202602/region=beijing
PURGE ile belirli bölümleri birleştirin
-- Merge two named partitions into a new destination partition.
ALTER TABLE sale_detail MERGE IF EXISTS
PARTITION(sale_date='202601', region='hangzhou'),
PARTITION(sale_date='202602', region='beijing')
OVERWRITE PARTITION(sale_date='202603', region='shanghai') PURGE;
-- View partitions after the merge.
SHOW PARTITIONS sale_detail;
-- Sample result:
-- sale_date=202603/region=shanghai
Bölüm silin
Bir tablodan bir veya daha fazla bölümü kaldırın. Belirli bölümler ada göre silinebilir veya toplu silme için filtre koşulları kullanılabilir.
Bölümlerin silinmesi depolama kullanımını azaltır. Eski bölümlerin otomatik olarak silinmesi için Yaşam Döngüsü özelliğini kullanın.
Kullanım notları
Her bölüm filtre yan tümcesi yalnızca bir bölüm anahtarı sütununa başvurabilir.
Filtre ifadelerinde kullanılan işlevler yerleşik skaler işlevler olmalıdır.
Sözdizimi
Belirli bölümleri silin
-- Delete one partition.
ALTER TABLE <table_name> DROP [IF EXISTS] PARTITION <pt_spec>;
-- Delete multiple partitions.
ALTER TABLE <table_name> DROP [IF EXISTS] PARTITION <pt_spec>,PARTITION <pt_spec>[,PARTITION <pt_spec>....];
Filtre koşuluyla bölümleri silin
ALTER TABLE <table_name> DROP [IF EXISTS] PARTITION <partition_filtercondition>;
Parametreler
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Bölüm filtre koşulu sözdizimi
Hem silme hem de kesme işlemleri aynı bölüm filtre sözdizimini destekler:
partition_filtercondition
: PARTITION (<partition_col> <relational_operators> <partition_col_value>)
| PARTITION (scalar(<partition_col>) <relational_operators> <partition_col_value>)
| PARTITION (<partition_filtercondition1> AND|OR <partition_filtercondition2>)
| PARTITION (NOT <partition_filtercondition>)
| PARTITION (<partition_filtercondition1>)[,PARTITION (<partition_filtercondition2>), ...]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Örnekler
Belirli bölümleri silin
-- Delete one partition.
ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date='202603',region='shanghai');
-- Delete two partitions at once.
ALTER TABLE sale_detail DROP IF EXISTS PARTITION(sale_date='202412',region='hangzhou'),PARTITION(sale_date='202412',region='shanghai');
Filtre koşuluyla bölümleri silin (tek düzeyli tablo)
-- Create a single-level partitioned table with sample partitions.
CREATE TABLE IF NOT EXISTS sale_detail_del(
shop_name STRING,
customer_id STRING,
total_price DOUBLE)
PARTITIONED BY (sale_date STRING);
-- Add partitions.
ALTER TABLE sale_detail_del ADD IF NOT EXISTS
PARTITION (sale_date= '201910') PARTITION (sale_date= '201911') PARTITION (sale_date= '201912')
PARTITION (sale_date= '202001') PARTITION (sale_date= '202002') PARTITION (sale_date= '202003')
PARTITION (sale_date= '202004') PARTITION (sale_date= '202005') PARTITION (sale_date= '202006')
PARTITION (sale_date= '202007');
-- Delete by comparison.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date < '201911');
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date >= '202007');
-- Delete by pattern matching.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date LIKE '20191%');
-- Delete by value list.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date IN ('202002','202004','202006'));
-- Delete by range.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date BETWEEN '202001' AND '202007');
-- Delete using a scalar function.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(substr(sale_date, 1, 4) = '2020');
-- Delete with OR condition.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date < '201912' OR sale_date >= '202006');
-- Delete with AND condition.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date > '201912' AND sale_date <= '202004');
-- Delete with NOT condition.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(NOT sale_date > '202004');
-- Multiple filter clauses separated by commas are combined with OR.
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date < '201911'), PARTITION(sale_date >= '202007');
-- Delete by regular expression.
ALTER TABLE sale_detail_del ADD IF NOT EXISTS
PARTITION (sale_date= '2019-10-05')
PARTITION (sale_date= '2019-10-06')
PARTITION (sale_date= '2019-10-07');
ALTER TABLE sale_detail_del DROP IF EXISTS PARTITION(sale_date RLIKE '2019-\\d+-\\d+');
Çok düzeyli bölümlendirilmiş bir tablodan bölümleri silin
-- Create a multi-level partitioned table with sample partitions.
CREATE TABLE IF NOT EXISTS region_sale_detail(
shop_name STRING,
customer_id STRING,
total_price DOUBLE)
PARTITIONED BY (sale_date STRING , region STRING );
-- Add partitions.
ALTER TABLE region_sale_detail ADD IF NOT EXISTS
PARTITION (sale_date= '201910',region = 'shanghai') PARTITION (sale_date= '201911',region = 'shanghai')
PARTITION (sale_date= '201912',region = 'shanghai') PARTITION (sale_date= '202001',region = 'shanghai')
PARTITION (sale_date= '202002',region = 'shanghai') PARTITION (sale_date= '201910',region = 'beijing')
PARTITION (sale_date= '201911',region = 'beijing') PARTITION (sale_date= '201912',region = 'beijing')
PARTITION (sale_date= '202001',region = 'beijing') PARTITION (sale_date= '202002',region = 'beijing');
-- Comma-separated filter clauses are combined with OR.
-- This deletes all partitions where sale_date < '201911' OR region = 'beijing'.
ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911'),PARTITION(region = 'beijing');
-- To combine conditions with AND, place both conditions in a single clause.
-- This deletes only partitions where sale_date < '201911' AND region = 'beijing'.
ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911', region = 'beijing');
Her filtre yan tümcesi yalnızca bir bölüm anahtarı sütununa başvurabilir. Tek bir filtre yan tümcesinde AND kullanarak birden çok bölüm anahtarı sütununu birleştirmek hata döndürür.
-- The following statement fails because it references two partition key columns
-- (sale_date and region) with AND in a single filter clause.
ALTER TABLE region_sale_detail DROP IF EXISTS PARTITION(sale_date < '201911' AND region = 'beijing');
-- Error returned:
-- FAILED: ODPS-0130071:[1,82] Semantic analysis exception - invalid column reference region,
-- partition expression must have one and only one column reference
Sütun veya açıklama ekleyin
Mevcut bölümlendirilmemiş veya bölümlendirilmiş bir tabloya sütun veya açıklama ekleyebilirsiniz. Kısıtlamalar hakkında daha fazla bilgi için bkz. Kullanım notları. MaxCompute STRUCT<x: STRING, y: BIGINT> ve MAP<STRING, STRUCT<x: DOUBLE, y: DOUBLE>> gibi STRUCT türündeki sütunların eklenmesini destekler.
-
Önkoşullar
Şema evrimini etkinleştirmek için
setproject odps.schema.evolution.enable=true;komutunu çalıştırın.İzinler: Bu proje düzeyinde bir özelliktir. Bu komutu çalıştırmak için proje sahibi olmanız veya proje düzeyinde Super_Administrator ya da Admin rolüne sahip olmanız gerekir. Daha fazla bilgi için bkz. Kullanıcıya yerleşik yönetim rolü atama.
Etki süresi: Değişiklik yaklaşık 10 dakika içinde etkili olur.
-
Sözdizimi
ALTER TABLE <table_name> ADD COLUMNS [IF NOT EXISTS] (<col_name1> <type1> COMMENT ['<col_comment>'] [, <col_name2> <type2> COMMENT '<col_comment>'...] ); -
Parametreler
Parametre
Zorunlu
Açıklama
table_name
Evet
Değiştirilecek tablonun adı. Yeni sütunlar tablonun sonuna eklenir.
col_name
Evet
Yeni sütunun adı.
type
Evet
Yeni sütunun veri türü.
col_comment
Hayır
Yeni sütun için açıklama. -
Örnekler
-
Örnek 1: sale_detail tablosuna iki sütun ekleyin.
ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(customer_name STRING, education BIGINT); -
Örnek 2: sale_detail tablosuna açıklamalı iki sütun ekleyin.
ALTER TABLE sale_detail ADD COLUMNS (customer_name STRING COMMENT 'Customer', education BIGINT COMMENT 'Education' ); -
Örnek 3: sale_detail tablosuna karmaşık veri türünde bir sütun ekleyin.
ALTER TABLE sale_detail ADD COLUMNS (region_info struct<province:string, area:string>); -
Örnek 4: Zaten var olan bir sütunu eklemek için IF NOT EXISTS kullanırsanız komut sütunu tekrar eklemeden başarı mesajı döndürür.
-- The statement is successful, but the ID column is not repeatedly added. ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(id bigint); -
Örnek 5: Delta tablosuna sütun ekleyin.
CREATE TABLE delta_table_test (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT) TBLPROPERTIES ("transactional"="true"); ALTER TABLE delta_table_test ADD COLUMNS (val2 bigint);
-
Sütun silin
Mevcut bölümlendirilmemiş veya bölümlendirilmiş bir tablodan bir veya daha fazla sütunu silebilirsiniz. Kısıtlamalar hakkında daha fazla bilgi için bkz. Kullanım notları.
-
Önkoşullar
Şema evrimini etkinleştirmek için
setproject odps.schema.evolution.enable=true;komutunu çalıştırın.İzinler: Bu proje düzeyinde bir özelliktir. Bu komutu çalıştırmak için proje sahibi olmanız veya proje düzeyinde Super_Administrator ya da Admin rolüne sahip olmanız gerekir. Daha fazla bilgi için bkz. Kullanıcıya yerleşik yönetim rolü atama.
Etki süresi: Değişiklik yaklaşık 10 dakika içinde etkili olur.
-
Sözdizimi
-- Delete a single column. ALTER TABLE <table_name> DROP COLUMN <col_name>; -- Delete multiple columns. ALTER TABLE <table_name> DROP COLUMNS <col_name1>[, <col_name2>...]; -
Parametreler
table_name: Zorunlu. Değiştirilecek tablonun adı.
col_name: Zorunlu. Silinecek sütunun adı.
-
Örnekler
-- Example 1: Delete the customer_id column from the sale_detail table. ALTER TABLE sale_detail DROP COLUMNS customer_id; -- Example 2: Delete the shop_name and total_price columns from the sale_detail table. ALTER TABLE sale_detail DROP COLUMNS shop_name, total_price;
Sütun veri türlerini değiştirin
Mevcut bir sütunun veri türünü değiştirebilirsiniz. Kısıtlamalar hakkında daha fazla bilgi için bkz. Kullanım notları.
-
Önkoşullar
Şema evrimini etkinleştirmek için
setproject odps.schema.evolution.enable=true;komutunu çalıştırın.İzinler: Bu proje düzeyinde bir özelliktir. Bu komutu çalıştırmak için proje sahibi olmanız veya proje düzeyinde Super_Administrator ya da Admin rolüne sahip olmanız gerekir. Daha fazla bilgi için bkz. Kullanıcıya yerleşik yönetim rolü atama.
Etki süresi: Değişiklik yaklaşık 10 dakika içinde etkili olur.
-
Sözdizimi
ALTER TABLE <table_name> CHANGE [COLUMN] <old_column_name> <new_column_name> <new_data_type>; -
Parametreler
Parametre
Zorunlu
Açıklama
table_name
Evet
Sütunu içeren tablonun adı.
old_column_name
Evet
Değiştirilecek sütunun adı.
new_column_name
EvetSütunun yeni adı.
old_column_name ile new_column_name aynı olabilir; bu sütun adının değiştirilmediği anlamına gelir. Ancak new_column_name old_column_name dışındaki herhangi bir sütun adıyla aynı olamaz.
new_data_type
Evet
Sütun için yeni veri türü. -
Örnek
-- Change the data type of the id field in the sale_detail table from BIGINT to STRING. ALTER TABLE sale_detail CHANGE COLUMN id id STRING; -
Desteklenen veri türü dönüşümleri
NotY dönüşümün desteklendiğini gösterir. N dönüşümün desteklenmediğini gösterir. - dönüşümün uygulanamadığını gösterir. Y() parantez içindeki koşul karşılanırsa dönüşümün desteklendiğini gösterir.

Sütun sırasını değiştirin
Mevcut bölümlendirilmemiş veya bölümlendirilmiş bir tablodaki sütun sırasını değiştirebilirsiniz. Kısıtlamalar hakkında daha fazla bilgi için bkz. Kullanım notları.
-
Önkoşullar
Şema evrimini etkinleştirmek için
setproject odps.schema.evolution.enable=true;komutunu çalıştırın.İzinler: Bu proje düzeyinde bir özelliktir. Bu komutu çalıştırmak için proje sahibi olmanız veya proje düzeyinde Super_Administrator ya da Admin rolüne sahip olmanız gerekir. Daha fazla bilgi için bkz. Kullanıcıya yerleşik yönetim rolü atama.
Etki süresi: Değişiklik yaklaşık 10 dakika içinde etkili olur.
-
Sözdizimi
ALTER TABLE <table_name> CHANGE <old_column_name> <new_column_name> <column_type> AFTER <column_name>; -
Parametreler
Parametre
Zorunlu
Açıklama
table_name
Evet
Değiştirilecek tablonun adı.
old_column_name
Evet
Taşınacak sütunun adı.
new_col_name
EvetSütunun yeni adı.
new_col_name ile old_column_name aynı olabilir; bu sütun adının değiştirilmediği anlamına gelir. Ancak new_col_name old_column_name dışındaki herhangi bir sütun adıyla aynı olamaz.
column_type
Evet
Sütunun özgün veri türü. Bu değiştirilemez.
column_name
Evet
Sütunu yeniden sıralamak için column_name öğesinden sonra taşır. -
Örnekler
-- Change the name of the customer column in the sale_detail table to customer_id and move it after the total_price column. ALTER TABLE sale_detail CHANGE customer customer_id STRING AFTER total_price; -- Move the customer_id column in the sale_detail table after the total_price column without changing the column name. ALTER TABLE sale_detail CHANGE customer_id customer_id STRING AFTER total_price;
Sütun adını değiştirin
Mevcut bölümlendirilmemiş veya bölümlendirilmiş bir tablodaki bir sütunun adını değiştirebilirsiniz.
-
Sözdizimi
ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> RENAME TO <new_col_name>; -
Parametreler
Parametre
Zorunlu
Açıklama
table_name
Evet
Değiştirilecek tablonun adı.
old_col_name
Evet
Sütunun mevcut adı. Sütun mevcut olmalıdır.
new_col_name
Evet
Sütun için yeni ad. Sütun adı tablo içinde benzersiz olmalıdır. -
Örnek
-- Rename the customer_name column in the sale_detail table to customer. ALTER TABLE sale_detail CHANGE COLUMN customer_name RENAME TO customer;
Sütun açıklamasını değiştirin
Mevcut bölümlendirilmemiş veya bölümlendirilmiş bir tablodaki bir sütunun açıklamasını değiştirebilirsiniz.
-
Sözdizimi
ALTER TABLE <table_name> CHANGE COLUMN <col_name> COMMENT '<col_comment>'; -
Parametreler
Parametre
Zorunlu
Açıklama
table_name
Evet
Değiştirilecek tablonun adı.
col_name
Evet
Açıklamasını değiştirmek istediğiniz sütunun adı. Sütun mevcut olmalıdır.
col_comment
Evet
Yeni açıklama geçerli bir dize olmalıdır. Maksimum uzunluk 1.024 bayttır. -
Örnek
-- Change the comment of the customer column in the sale_detail0113 table. ALTER TABLE sale_detail0113 CHANGE COLUMN customer COMMENT 'customer';
Sütun adını ve açıklamasını değiştirin
Bölümlendirilmemiş veya bölümlendirilmiş bir tablodaki bir sütunun adını ve açıklamasını değiştirebilirsiniz.
-
Sözdizimi
ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> <new_col_name> <column_type> COMMENT '<col_comment>'; -
Parametreler
Parametre
Zorunlu
Açıklama
table_name
Evet
Değiştirilecek tablonun adı.
old_col_name
Evet
Değiştirilecek sütunun mevcut adı. Sütun mevcut olmalıdır.
new_col_name
Evet
Sütun için yeni ad. Sütun adı tablo içinde benzersiz olmalıdır.
column_type
Evet
Sütunun veri türü.
col_comment
İsteğe bağlı
Yeni açıklama. Maksimum uzunluk 1.024 bayttır. -
Örnek
-- Change the name of the customer column in the sale_detail table to customer_newname and change its comment to 'customer'. ALTER TABLE sale_detail CHANGE COLUMN customer customer_newname STRING COMMENT 'customer';
Sütunun NOT NULL özelliğini değiştirin
Bölüm anahtarı olmayan bir sütunun NOT NULL özelliğini değiştirebilirsiniz. Örneğin bölüm anahtarı olmayan bir sütun NULL değerlere izin vermeyecek şekilde tanımlanmışsa bu komutu kullanarak NULL değerlere izin verecek şekilde değiştirebilirsiniz.
Bu işlem geri alınamaz: NULL değerlere izin verdikten sonra bir sütunu NULL değerlere izin vermeyecek şekilde değiştiremezsiniz.
-
Nullableözelliğini görüntülemek ve sütunun NULL değerlere izin verip vermediğini belirlemek içinDESC EXTENDED table_name;komutunu çalıştırın:Nullabledeğeritrueise NULL değerlere izin verilir.Nullabledeğerifalseise NULL değerlere izin verilmez.
-
Sözdizimi
ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> NULL; -
Parametreler
Parametre
Zorunlu
Açıklama
table_name
Evet
Değiştirilecek tablonun adı.
old_col_name
Evet
Değiştirilecek bölüm anahtarı olmayan sütunun adı. Sütun mevcut olmalıdır. -
Örnek
-- Create a partitioned table in which the id column cannot be NULL. CREATE TABLE null_test(id INT NOT NULL, name STRING) PARTITIONED BY (ds string); -- View table properties. DESC EXTENDED null_test; -- The following result is returned: +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | ExtendedLabel | Nullable | DefaultValue | Comment | +------------------------------------------------------------------------------------+ | id | int | | | false | NULL | | | name | string | | | true | NULL | | +------------------------------------------------------------------------------------+ | Partition Columns: | +------------------------------------------------------------------------------------+ | ds | string | | +------------------------------------------------------------------------------------+ -- Allow the id column to be NULL. ALTER TABLE null_test CHANGE COLUMN id NULL; -- View table properties. DESC EXTENDED null_test; -- The following result is returned: +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | ExtendedLabel | Nullable | DefaultValue | Comment | +------------------------------------------------------------------------------------+ | id | int | | | true | NULL | | | name | string | | | true | NULL | | +------------------------------------------------------------------------------------+ | Partition Columns: | +------------------------------------------------------------------------------------+ | ds | string | | +------------------------------------------------------------------------------------+
İşlemsel tablo dosyalarını sıkıştırın
İşlemsel bir tablonun temel fiziksel depolaması doğrudan okunamayan temel dosyalardan ve delta dosyalardan oluşur. İşlemsel bir tabloda update veya delete işlemleri gerçekleştirildiğinde yalnızca delta dosyalar eklenir. Temel dosyalar değiştirilmez. Sonuç olarak daha fazla güncelleme veya silme işlemi daha yüksek depolama tüketimine ve daha yüksek sorgu maliyetlerine yol açar.
Aynı tablo veya bölüm üzerinde birden çok update veya delete işlemi gerçekleştirmek çok sayıda delta dosyası oluşturur. Verileri okurken sistem hangi satırların güncellendiğini veya silindiğini belirlemek için bu delta dosyalarını yükler. Çok sayıda delta dosyası veri okuma performansını düşürür. Bu durumda depolamayı azaltmak ve veri okuma performansını artırmak için temel dosyaları ve delta dosyaları sıkıştırın.
-
Sözdizimi
ALTER TABLE <table_name> [PARTITION (<partition_key> = '<partition_value>' [, ...])] compact {minor|major}; -
Parametreler
table_name: Zorunlu. Dosyaları sıkıştırılacak işlemsel tablonun adı.
partition_key: İsteğe bağlı. İşlemsel tablo bölümlendirilmiş bir tabloysa bölüm sütunu adı.
partition_value: İsteğe bağlı. İşlemsel tablo bölümlendirilmiş bir tabloysa bölüm sütunu değeri.
-
major|minor: En az birini belirtin. Farklar aşağıdaki gibidir:
minor: Temel dosyaları ve ilişkili tüm delta dosyalarını birleştirerek delta dosyalarını ortadan kaldırır.major: Yalnızca temel dosyaları ve ilişkili tüm delta dosyalarını birleştirerek delta dosyalarını ortadan kaldırmakla kalmaz aynı zamanda tablonun temel dosyaları arasındaki küçük dosyaları da birleştirir. Temel dosyalar küçükse (32 MB'den az) veya delta dosyalar mevcutsa bu tablodainsert overwriteişlemi gerçekleştirmeye eşdeğerdir. Ancak temel dosyalar yeterince büyükse (32 MB veya daha fazla) ve delta dosyalar yoksa yeniden yazma gerçekleşmez.
-
Örnekler
-
Örnek 1: acid_delete işlemsel tablosunun dosyalarını sıkıştırın.
ALTER TABLE acid_delete compact minor;Örnek çıktı:
Summary: Nothing found to merge, set odps.merge.cross.paths=true IF cross path merge is permitted. OK -
Örnek 2: acid_update_pt işlemsel tablosunun dosyalarını sıkıştırın.
ALTER TABLE acid_update_pt PARTITION (ds = '2019') compact major;Örnek çıktı:
Summary: table name: acid_update_pt /ds=2019 instance count: 2 run time: 6 before merge, file count: 8 file size: 2613 file physical size: 7839 after merge, file count: 2 file size: 679 file physical size: 2037 OK
-
Küçük dosyaları birleştirin
Dağıtılmış bir dosya sistemi verileri bloklar halinde depolar. Blok boyutundan (64 MB) küçük dosyalara küçük dosyalar denir. Dağıtılmış sistemler kaçınılmaz olarak SQL veya diğer dağıtılmış motor hesaplama sonuçları ve Tunnel veri alımı çıkışı gibi küçük dosyalar üretir. Küçük dosyaların birleştirilmesi hesaplama performansını artırabilir.
Sözdizimi
ALTER TABLE <tablename> [PARTITION(<partition_key>=<partition_value>)] MERGE SMALLFILES;
-
Parametreler
table_name: Zorunlu. Dosyaları birleştirilecek tablonun adı.
partition_key: İsteğe bağlı. Tablo bölümlendirilmiş bir tabloysa bölüm sütunu adı.
partition_value: İsteğe bağlı. Tablo bölümlendirilmiş bir tabloysa bölüm sütunu değeri.
-
Örnekler
SET odps.merge.cross.paths=true; SET odps.merge.smallfile.filesize.threshold=128; SET odps.merge.max.filenumber.per.instance = 2000; ALTER TABLE tbcdm.dwd_tb_log_pv_di PARTITION (ds='20151116') MERGE smallfiles;
Küçük dosyaları birleştirme özelliği hesaplama kaynakları gerektirir. Kullandıkça öde örnekler için bu işlem ücretlendirilir. Faturalandırma kuralları SQL kullandıkça öde faturalandırmasıyla aynıdır. Daha fazla bilgi için bkz. Hesaplama fiyatlandırması (kullandıkça öde).
Daha fazla bilgi için bkz. Küçük dosyaları birleştirme.
İlgili ifadeler
CREATE TABLE: Bölümlendirilmemiş tablo, bölümlendirilmiş tablo, harici tablo veya kümelenmiş tablo oluşturur.
TRUNCATE TABLE: Belirtilen tablodaki verileri keser.
DROP TABLE: Bölümlendirilmiş veya bölümlendirilmemiş tabloyu siler.
DESC TABLE/VIEW: MaxCompute iç tabloları, görünümler, materyalleştirilmiş görünümler, harici tablolar, kümelenmiş tablolar veya işlemsel tablolar hakkında bilgileri görüntüler.
SHOW: Bir tablonun SQL DDL ifadesini görüntüler, projedeki tüm tabloları ve görünümleri listeler veya bir tablonun tüm bölümlerini listeler.\