View a markdown version of this page

Mengubah definisi tabel - Amazon Redshift

Amazon Redshift tidak akan lagi mendukung penggunaan Python UDF setelah 30 Juni 2026. Kami akan mulai menegakkannya secara bertahap. Untuk informasi lebih lanjut tentang detail opsi akhir masa pakai dan migrasi Python, lihat posting blog yang diterbitkan pada 30 Juni 2025.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mengubah definisi tabel

ALTER TABLEpernyataan digunakan untuk mengubah definisi tabel, termasuk skema, spesifikasi partisi, dan properti. Anda dapat menggunakan pernyataan DDL ini untuk mengelola tabel Iceberg Anda secara langsung melalui Amazon Redshift.

Semua ALTER TABLE pernyataan mendukung penggunaan referensi skema eksternal atau referensi notasi tiga bagian untuk tabel Iceberg. Dalam contoh sintaks di bawah ini, iceberg_table dapat berupa salah satu dari berikut ini:

-- External schema notation: <external_schema>.<table_name> -- Three-part notation for S3 table buckets: "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> -- Three-part notation for the awsdatacatalog root catalog: awsdatacatalog.<database_name>.<table_name>

Untuk informasi selengkapnya, lihat Mereferensikan tabel Iceberg di Amazon Redshift.

Pertimbangkan hal berikut saat menggunakan ALTER TABLE pernyataan:

  • ALTER TABLEpernyataan saat ini hanya mendukung tabel Iceberg v2 atau v3.

  • Semua ALTER TABLE pernyataan adalah operasi khusus metadata.

  • ALTER TABLEpernyataan tidak mendukung tabel dengan kolom tipe kompleks.

Meningkatkan ke Iceberg v3

Anda dapat memutakhirkan tabel Iceberg v2 ke v3 menggunakan: ALTER TABLE SET TABLE PROPERTIES

ALTER TABLE iceberg_table SET TABLE PROPERTIES ('format-version' = '3');

Untuk detail tambahan, lihat Meningkatkan dari v2 ke v3.

UBAH TABEL GANTI NAMA KOLOM

ALTER TABLE iceberg_table RENAME [COLUMN] col_name TO new_name;

ALTER TABLE RENAME COLUMNmengganti nama kolom yang ada. Ini col_name bisa berupa kolom partisi atau kolom yang tidak dipartisi. Setelah mengganti nama, tipe data kolom dan spesifikasi partisi tidak berubah.

catatan

ALTER TABLE RENAME COLUMNtidak didukung untuk tabel AWS Lake Formation terdaftar.

UBAH ADD/DROP KOLOM TABEL

ALTER TABLE iceberg_table ADD [COLUMN] col_name col_type;
ALTER TABLE iceberg_table DROP [COLUMN] col_name;

ADD COLUMNmenambahkan satu kolom ke tabel Iceberg yang ada. Anda dapat menggunakan jenis data apa pun yang didukung oleh Amazon Redshift Iceberg write. Untuk informasi selengkapnya, lihat Jenis data yang didukung dengan tabel Apache Iceberg.

ADD COLUMNadalah operasi khusus metadata. Nilai kolom yang baru ditambahkan pada baris yang ada adalahNULL.

DROP COLUMNmenjatuhkan kolom dari tabel Iceberg yang ada. Untuk tabel yang dipartisi, Anda tidak dapat melepaskan kolom yang termasuk dalam spesifikasi partisi saat ini. Anda harus menghapus bidang partisi yang melibatkan kolom terlebih dahulu sebelum menjatuhkan kolom. Untuk informasi selengkapnya, lihat UBAH TABEL TAMBAH, JATUHKAN, dan GANTI BIDANG PARTISI.

Untuk tabel Iceberg v3, Anda dapat menentukan nilai default saat menambahkan kolom. File data yang ada mengembalikan default yang ditentukan alih-alih NULL untuk kolom yang baru ditambahkan tanpa memerlukan penulisan ulang data. Nilai kolom default hanya didukung untuk tabel Iceberg v3. Amazon Redshift mengembalikan kesalahan jika Anda menentukan nilai default pada tabel Iceberg v2.

-- External schema notation ALTER TABLE my_external_schema.orders ADD COLUMN priority INT DEFAULT 0; -- Three-part notation (awsdatacatalog / Glue) ALTER TABLE awsdatacatalog.my_glue_db.orders ADD COLUMN priority INT DEFAULT 0; -- Three-part notation (S3 Table Buckets) ALTER TABLE "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders ADD COLUMN priority INT DEFAULT 0;

Untuk baris yang ada, nilai default diisi untuk kolom yang baru ditambahkan:

-- Existing table with rows SELECT id FROM my_external_schema.orders; -- 1 -- 2 -- Add a column with a default ALTER TABLE my_external_schema.orders ADD COLUMN status varchar DEFAULT 'active'; -- Existing rows return the default without a data rewrite SELECT id, status FROM my_external_schema.orders; -- 1 | active -- 2 | active

MENGUBAH TABEL MENGUBAH KOLOM

ALTER TABLE iceberg_table ALTER COLUMN column_name TYPE updated_data_type;

ALTER TABLE ALTER COLUMNmengubah tipe data kolom yang ada. Hanya pelebaran tipe yang diperbolehkan, bukan penyempitan. Karena data tidak ditulis ulang setelahALTER, penyempitan tipe data dapat menyebabkan luapan saat mengonsumsi data tabel yang ada. Jenis pelebaran berikut diperbolehkan sesuai spesifikasi gunung es:

int → bigint float → double decimal(P, S) → decimal(P2, S) where P2 > P (scale cannot be changed)

Di Amazon Redshift, tipe data dapat memiliki alias. Misalnya, bilangan bulat 4-byte menggunakan nama int tipe atau. int4 Selama mereka dipetakan ke int 4-byte dalam tipe Iceberg, pelebaran tipe ke bilangan bulat 8-byte diperbolehkan.

Misalnya, tabel Iceberg dibuat menggunakan tipe integer 4-byte:

CREATE TABLE iceberg_table (cint int) USING ICEBERG LOCATION 's3://your-bucket-name/prefix/';

Hal ini dapat diperluas dengan ALTER pernyataan ini:

ALTER TABLE iceberg_table ALTER COLUMN cint TYPE int8;

Untuk daftar lengkap pemetaan tipe data antara tipe Amazon Redshift dan tipe Iceberg, lihat. Jenis data yang didukung dengan tabel Apache Iceberg

Memperluas jenis kolom yang termasuk dalam spesifikasi partisi yang ada tidak didukung.

Untuk tabel Iceberg v3, Anda dapat mengatur atau menghapus nilai default pada kolom yang ada:

ALTER TABLE iceberg_table ALTER COLUMN column_name SET DEFAULT literal_value; ALTER TABLE iceberg_table ALTER COLUMN column_name DROP DEFAULT;

SET DEFAULT mengubah nilai default kolom yang ada. Default baru berlaku untuk file data yang ditulis setelah perubahan. File data yang ada terus menggunakan default sebelumnya.

DROP DEFAULT menghapus nilai default yang diterapkan pada penulisan baru, setara dengan menyetel default ke NULL. File data yang tidak berisi kolom terus mengembalikan nilai default awal kolom.

-- External schema notation ALTER TABLE my_external_schema.orders ALTER COLUMN status SET DEFAULT 'active'; ALTER TABLE my_external_schema.orders ALTER COLUMN status DROP DEFAULT; -- Three-part notation (awsdatacatalog / Glue) ALTER TABLE awsdatacatalog.my_glue_db.orders ALTER COLUMN status SET DEFAULT 'active'; ALTER TABLE awsdatacatalog.my_glue_db.orders ALTER COLUMN status DROP DEFAULT; -- Three-part notation (S3 Table Buckets) ALTER TABLE "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders ALTER COLUMN status SET DEFAULT 'active'; ALTER TABLE "amzn-s3-demo-bucket@s3tablescatalog".my_namespace.orders ALTER COLUMN status DROP DEFAULT;

UBAH PROPERTI TABEL SET TABEL

ALTER TABLE iceberg_table SET TABLE PROPERTIES ( 'compression_type' = 'compression_value');

Pernyataan ini memungkinkan Anda untuk mengganti properti tabel default. Saat ini satu-satunya properti tabel yang diizinkan untuk pernyataan ini adalahcompression_type. Anda dapat menulisnya untuk menggunakan jenis kompresi yang berbeda untuk tabel Iceberg file Parquet. Data dimasukkan setelah ALTER menggunakan tipe kompresi baru.

Nilai yang mungkin untuk compression_type adalah:brotli,gzip,snappy,uncompressed, danzstd.

Anda juga dapat memutakhirkan tabel Iceberg v2 yang ada ke v3 dengan mengatur versi format:

ALTER TABLE iceberg_table SET TABLE PROPERTIES ('format-version' = '3');

Untuk detail tambahan, lihat Meningkatkan dari v2 ke v3.

UBAH TABEL TAMBAH, JATUHKAN, dan GANTI BIDANG PARTISI

ALTER TABLE iceberg_table ADD PARTITION FIELD column_name | transform_function;
ALTER TABLE iceberg_table DROP PARTITION FIELD column_name | transform_function;
ALTER TABLE iceberg_table REPLACE PARTITION FIELD column_name | transform_function WITH column_name | transform_function;

Per [ADD | DROP | REPLACE] PARTITION FIELD nyataan ini memungkinkan Anda untuk mengubah spesifikasi partisi tabel yang ada, mendukung evolusi partisi melalui Amazon Redshift.

Per ALTER nyataan untuk spesifikasi partisi hanya mengubah metadata tabel dan tidak mempartisi ulang data tabel yang ada. Setelah ituALTER, data baru dimasukkan ke dalam tabel mengikuti spesifikasi partisi yang baru ditentukan.

Pertimbangkan batasan berikut untuk pernyataan ini:

  • Saat menentukan bidang partisi baru melalui ADD atauREPLACE ... WITH ..., bidang baru tidak dapat menyertakan kolom yang sudah menjadi bagian dari bidang partisi lainnya. Ini adalah batasan yang sama seperti ketika Anda menentukan spesifikasi partisi awal diCREATE TABLE. Untuk informasi selengkapnya, lihat CREATE TABLE.

    Misalnya, ketika Anda memiliki tabel:

    CREATE TABLE iceberg_table ... PARTITIONED BY year(ship_date) USING ICEBERG ...;

    Berikut ini gagal karena ship_date sudah menjadi bagian dari bidang partisi yang ada:

    ALTER TABLE iceberg_table ADD PARTITION FIELD bucket(128, ship_date);
  • Saat menambahkan bidang partisi baru, bidang yang baru ditambahkan selalu diperlakukan sebagai tingkat terakhir partisi tabel. Contoh:

    CREATE TABLE iceberg_table ... PARTITIONED BY year(ship_date) USING ICEBERG ...; ALTER TABLE iceberg_table ADD PARTITION FIELD bucket(256, item_id);

    Spesifikasi partisi tabel sama dengan:

    CREATE TABLE iceberg_table ... PARTITIONED BY (year(ship_date), bucket(256, item_id)) USING ICEBERG ...;
  • Saat menjatuhkan bidang partisi, itu tidak terbatas pada tingkat partisi terakhir. Anda dapat menghapus bidang partisi yang ada. Contoh:

    CREATE TABLE iceberg_table ... PARTITIONED BY (year(ship_date), bucket(256, item_id)) USING ICEBERG ...; ALTER TABLE iceberg_table DROP PARTITION FIELD year(ship_date);

    Setelah iniALTER, tabel hanya dipartisi olehbucket(256, item_id).

  • Saat memanggilREPLACE PARTITION FIELD ... WITH ..., bidang partisi yang akan diganti dapat berupa bidang apa pun dalam spesifikasi dan tidak terbatas pada bidang terakhir. Contoh:

    CREATE TABLE iceberg_table ... PARTITIONED BY (year(ship_date), bucket(256, item_id)) USING ICEBERG ...; ALTER TABLE iceberg_table REPLACE PARTITION FIELD year(ship_date) WITH month(ship_date);

    Setelah iniALTER, partisi tabel menjadi(month(ship_date), bucket(256, item_id)).

  • voidTransformasi tidak didukung dalam ALTER pernyataan partisi.