Amazon Redshift tidak akan lagi mendukung pembuatan Python UDFs baru mulai Patch 198. Python yang ada UDFs akan terus berfungsi hingga 30 Juni 2026. Untuk informasi lebih lanjut, lihat posting blog
Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Perintah SQL
Tabel Apache Iceberg di Amazon Redshift menyediakan cara ampuh untuk mengelola kumpulan data analitik besar di danau data Anda. Tabel ini mendukung transaksi ACID, evolusi skema, dan kemampuan perjalanan waktu sambil mempertahankan kinerja tinggi untuk beban kerja analitik. Menggunakan tabel Apache Iceberg, Anda dapat secara efisien mengatur dan mempartisi data Anda, mengontrol format file dan kompresi, dan terintegrasi dengan mulus dengan layanan lain. AWS
Anda dapat membuat tabel Iceberg yang dipartisi dan tidak dipartisi menggunakan dan perintah. CREATE TABLE
... USING ICEBERG CREATE TABLE ... USING ICEBERG AS SELECT Anda dapat mereferensikan tabel Iceberg menggunakan notasi skema eksternal (external_schema.table_name) atau notasi tiga bagian (). "catalog_name".database_name.table_name Contoh di bagian ini menunjukkan kedua metode.
Setelah Anda membuat tabel, Anda dapat menambahkan data menggunakan INSERT perintah standar. Ingatlah bahwa meskipun Amazon Redshift bekerja dengan banyak tipe data Iceberg, Anda mungkin perlu mengonversi beberapa format data saat memasukkan informasi.
Anda dapat melihat tabel Iceberg menggunakan SHOW TABLES perintah. Jika Anda ingin menghapus tabel dari AWS Glue Data Catalog, Anda dapat menggunakan DROP TABLE perintah. Perhatikan bahwa ini hanya menghapus pendaftaran tabel. Data aktual akan tetap disimpan sampai Anda menghapusnya secara terpisah.
Anda juga dapat memodifikasi data yang ada menggunakan DELETEUPDATE,, dan MERGE perintah. Semua pernyataan SQL lainnya, sepertiALTER TABLE, belum didukung pada tabel Iceberg.
Anda dapat menulis ke tabel Iceberg yang tidak dibuat oleh Amazon Redshift. Namun, ada beberapa keterbatasan:
-
Tabel harus berupa tabel Iceberg v2.
-
Tabel harus menggunakan Parket sebagai format data default.
-
Tabel tidak boleh memiliki kompresi metadata yang disetel ke True.
-
Tabel tidak boleh mengaktifkan Write-Audit-Publish (WAP).
Bagian berikut menunjukkan sintaks SQL untuk membuat, menyisipkan, memodifikasi, dan mengelola tabel Iceberg di Amazon Redshift.
CREATE TABLE
CREATE TABLE [IF NOT EXISTS]<external_schema>.<table_name>( column_name data_type [, ...] ) USING ICEBERG [LOCATION 's3://your-bucket-name/prefix/'] [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('compression_type'='<compression_value>')]
Anda juga dapat menggunakan notasi tiga bagian untuk bucket tabel S3:
CREATE TABLE "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>( column_name data_type [, ...] ) USING ICEBERG [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('compression_type'='<compression_value>')]
Perhatikan bahwa harus menjadi nama skema eksternal yang ada di mana tabel eksternal akan dibuat. Untuk informasi selengkapnya tentang cara membuat dan mengelola skema eksternal, lihat MEMBUAT SKEMA EKSTERNAL di dokumentasi Amazon Redshift.<external_schema>
LOCATIONKlausa mendefinisikan lokasi tabel untuk tabel Iceberg yang baru dibuat ini. Untuk tabel Amazon S3, LOCATION tidak dapat ditentukan karena lokasi tabel ditentukan oleh katalog tabel Amazon S3 (). s3tablescatalog
Dalam semua kasus lain, LOCATION diperlukan, dan itu harus menjadi lokasi kosong, artinya tidak ada objek Amazon S3 yang berbagi ember dan awalan yang sama ini. Perhatikan bahwa wilayah bucket Amazon S3 harus berada di wilayah yang sama dengan cluster Amazon Redshift.
Namun, AWS menyediakan metode untuk mereplikasi data dari tabel Iceberg yang disimpan AWS Glue Data Catalog dalam satu Wilayah AWS ke yang berbeda Wilayah AWS, yang memungkinkan Anda untuk mereplikasi penulisan ke wilayah yang berbeda. Untuk informasi selengkapnya, lihat Mereplikasi data di seluruh Wilayah AWS.
PARTITIONED BYmendefinisikan partisi tabel Iceberg. Amazon Redshift mendukung semua transformasi partisi Iceberg v2 kecuali untuk. void Berikut adalah daftar transformasi yang didukung:
-
identitas
-
ember [N]
-
memotong [W]
-
tahun
-
bulan
-
hari
-
jam
Untuk definisi lengkap dari transformasi ini dan tipe data yang kompatibel, lihat Transformasi Partisi dalam dokumentasi
PARTITIONED BYMendukung partisi multi-level. Misalnya, Anda dapat menjalankan perintah berikut:
CREATE TABLE ... USING ICEBERG LOCATION ... PARTITIONED BY (bucket(16, id), year(ship_date));
Namun, Amazon Redshift tidak mendukung penggunaan satu kolom di lebih dari satu transformasi. Misalnya, sintaks berikut tidak didukung:
CREATE TABLE ... USING ICEBERG LOCATION ... PARTITIONED BY (bucket(16, ship_date), year(ship_date));
TABLE PROPERTIESKlausa mendefinisikan properti tabel tambahan untuk tabel Iceberg ini. Satu-satunya properti tabel yang kami dukung adalah compression_type yang mendefinisikan kompresi file data Parket default. Jika ini tidak ditentukan, snappy digunakan sebagai codec kompresi. Nilai yang mungkin untuk compression_type adalah:zstd,brotli,gzip,snappy, danuncompressed.
catatan
CREATE TABLE ... LIKE ...tidak didukung untuk tabel Iceberg. Tabel gunung es juga tidak mendukung batasan kolom dan atribut kolom seperti tabel RMS.
Atau, Anda dapat membuat dan mengisi tabel Iceberg dalam satu operasi menggunakan: CREATE TABLE AS SELECT
BUAT TABEL SEBAGAI PILIH
CREATE TABLE<external_schema>.<table_name>[( column_name[, ...] )] USING ICEBERG [LOCATION 's3://your-bucket-name/prefix/'] [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('compression_type'='<compression-value>')] AS SELECT query
Anda juga dapat menggunakan notasi tiga bagian untuk membuat tabel dalam katalog yang dipasang secara otomatis:
CREATE TABLE "<catalog_name>".<database_name>.<table_name>[( column_name[, ...] )] USING ICEBERG [LOCATION 's3://your-bucket-name/prefix/'] [PARTITIONED BY [[column_name | transform_function]], ...] [TABLE PROPERTIES ('compression_type'='<compression-value>')] AS SELECT query
Ini mirip dengan CREATE TABLE pernyataan kecuali yang diikuti CREATE oleh SELECT pernyataan untuk mengisi tabel dengan hasil SELECT kueri.
CREATE TABLEKlausa di sini tidak lagi memungkinkan Anda untuk menentukan tipe data karena tipe data kolom akan ditentukan oleh SELECT kueri.
Jika SELECT kueri gagal karena alasan apa pun, kueri ini akan gagal dan tabel Iceberg tidak akan dibuat.
Anda dapat melihat struktur tabel Iceberg Anda menggunakan: SHOW
TABLE
TAMPILKAN TABEL
SHOW TABLE<external_schema>.<table_name>
Anda juga dapat menggunakan notasi tiga bagian dengan katalog yang dipasang secara otomatis:
SHOW TABLE "<catalog_name>".<database_name>.<table_name>
SHOW TABLEmenampilkan CREATE TABLE pernyataan untuk tabel Iceberg. Perintah akan menunjukkan hasil yang sesuai berdasarkan jenis tabel. Berikut ini adalah contoh SHOW TABLE output untuk tabel Iceberg:
CREATE TABLE my_schema.items (id int, price decimal(5, 2)) USING ICEBERG LOCATION 's3://my_s3_bucket/items/' PARTITIONED BY (bucket(16, id)) TABLE PROPERTIES ('compression_type'='snappy')
catatan
Untuk tabel Amazon S3, karena lokasi tabel dikelola oleh katalog tabel Amazon S3, klausa akan dihilangkan LOCATION dalam hasil. SHOW TABLE
Setelah membuat tabel, Anda dapat menambahkan data menggunakanINSERT INTO:
MASUKKAN KE
INSERT INTO<external_schema>.<table_name>[(column_name [, ...])] VALUES (...) INSERT INTO<external_schema>.<table_name>[(column_name [, ...])] (SELECT query) -- Using three-part notation for S3 table buckets: INSERT INTO "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>[(column_name [, ...])] VALUES (...) INSERT INTO "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>[(column_name [, ...])] (SELECT query)
Anda dapat INSERT INTO ada tabel Iceberg menggunakan sintaks di atas. Jika VALUES klausa digunakan, Anda memberikan nilai untuk kolom yang terdaftar olehcolumn_name, atau semua kolom jika column_name bagian dihilangkan.
Ketika data dimasukkan ke dalam tabel dipartisi, baris baru didistribusikan sesuai dengan spesifikasi partisi yang telah ditentukan. Jika karena alasan apapun SELECT query gagal, query akan gagal dan tidak ada data akan dimasukkan ke dalam tabel Iceberg.
DELETE
DELETEKueri untuk tabel Iceberg menggunakan DELETE sintaks yang ada dalam tabel RMS:
[ WITH [RECURSIVE]common_table_expression[,common_table_expression, ...] ] DELETE [ FROM ]iceberg_table[ { USING }table_name, ...] [ WHEREcondition]
Anda juga dapat menggunakan notasi tiga bagian untuk bucket tabel S3:
[ WITH [RECURSIVE]common_table_expression[,common_table_expression, ...] ] DELETE [ FROM ] "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>[ { USING }table_name, ...] [ WHEREcondition]
Dapat direferensikan menggunakan iceberg_table formulir, atau menggunakan notasi 3 bagian untuk katalog yang dipasang secara otomatis. Lihat Mereferensikan tabel Iceberg di Amazon Redshift.<external_schema>.<external_table_name>
Dalam table_nameUSING klausa akan digunakan untuk bergabung dengan tabel target untuk menghapus baris yang puas dengan kondisi. WHERE Itu bisa berupa tabel Iceberg atau tabel Amazon Redshift RMS.table_name
Karena Iceberg menggunakan skema partisi tersembunyi, pengguna dapat menggunakan DELETE kueri untuk menghapus partisi, mencapai efek yang sama seperti ALTER TABLE ... DROP
PARTITION ... untuk tabel Hive.
Misalnya, ketika kita telah mempartisi tabel Iceberg seperti di bawah ini:
CREATE TABLE my_external_schema.lineitem (l_item_id int, l_ship_date varchar, ... ) USING ICEBERG LOCATION ... PARTITIONED BY l_ship_date;
Kemudian kita dapat dengan mudah menghapus partisi menggunakan query seperti ini:
DELETE FROM my_external_schema.lineitem WHERE l_ship_date = '20251231';
Untuk kueri seperti ini, Amazon Redshift akan mengoptimalkan eksekusi untuk hanya melakukan operasi metadata saja dan korsleting eksekusi. Jadi tidak seperti DELETE kueri normal, kueri hapus metadata saja tidak menampilkan langkah eksekusi di: EXPLAIN
explain DELETE FROM my_external_schema.lineitem WHERE l_ship_date = '20251231'; QUERY PLAN ------------ "XN Seq Scan Metadata of my_external_schema.lineitem location: "s3://s3-path//table-location" format:ICEBERG (cost=0.00..0.01 rows=0 width=0)" (0 rows)
UPDATE
Sintaks UPDATE query untuk tabel Iceberg sangat mirip dengan UPDATE sintaks yang ada untuk tabel RMS:
[ WITH [RECURSIVE]common_table_expression[,common_table_expression, ...] ] UPDATEiceberg_table[ [ AS ] alias ] SET column = {expression} [,...] [ FROMfromlist] [ WHEREcondition]
Anda juga dapat menggunakan notasi tiga bagian untuk bucket tabel S3:
[ WITH [RECURSIVE]common_table_expression[,common_table_expression, ...] ] UPDATE "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>[ [ AS ] alias ] SET column = {expression} [,...] [ FROMfromlist] [ WHEREcondition]
Dapat direferensikan menggunakan iceberg_table formulir, atau menggunakan notasi 3 bagian untuk katalog yang dipasang secara otomatis. Lihat Mereferensikan tabel Gunung Es di Amazon Redshift.<external_schema>.<external_table_name>
Anda dapat memperbarui tabel dengan mereferensikan informasi di tabel lain. Cantumkan tabel lain ini dalam klausa FROM atau gunakan subquery sebagai bagian dari kondisi WHERE. Tabel sumber dapat berupa tabel Iceberg atau tabel Amazon Redshift RMS.
UPDATEjuga dapat berjalan pada tabel yang dipartisi. Saat UPDATE mengubah nilai kolom yang termasuk dalam spesifikasi partisi saat ini, baris baru yang diperbarui akan dimasukkan ke dalam partisi baru berdasarkan nilai yang baru diperbarui.
Misalnya, ketika kita memiliki tabel Iceberg yang dipartisi seperti di bawah ini:
CREATE TABLE my_external_schema.lineitem (l_item_id int, l_ship_date varchar, ... ) USING ICEBERG LOCATION ... PARTITIONED BY l_ship_date; INSERT INTO my_external_schema.lineitem VALUES (10099, '20251231', ...);
Dan ketika kami menjalankan kueri pembaruan di bawah ini:
UPDATE my_external_schema.lineitem SET l_ship_date = '20260101' WHERE l_item_id = 10099;
kita akan memindahkan baris ini dengan l_item_id 10099 dari partisi 20251231 ke partisi baru. 20260101
Penting juga untuk dicatat bahwa itu mungkin UPDATE memiliki beberapa nilai kandidat. Pertimbangkan kueri di bawah ini:
CREATE TABLE my_ext_schema.t1(x1 int, y1 int) USING ICEBERG LOCATION ...; CREATE TABLE my_ext_schema.t2(x2 int, y2 int) USING ICEBERG LOCATION ...; INSERT INTO my_ext_schema.t1 VALUES (1,10), (2,20), (3,30); INSERT INTO my_ext_schema.t2 VALUES (2,40), (2,50); UPDATE my_ext_schema.t1 SET y1=y2 FROM my_ext_schema.t2 WHERE x1=x2;
Dalam hal ini, y1 bisa 40 atau 50. Hasilnya adalah nondeterministik. Anda dapat mengatur parameter konfigurasi error_on_nondeterministic_update ke true untuk memaksa kesalahan kueri ketika kasus seperti itu terjadi. Ini konsisten dengan UPDATE perilaku tabel RMS yang ada. Untuk selengkapnya, lihat error_on_nondeterministic_update.
MERGE
MERGEKueri secara kondisional menggabungkan baris dari tabel sumber ke dalam tabel target. Ini berbagi sintaks MERGE kueri yang sama dengan tabel RMS yang ada:
MERGE INTOtarget_iceberg_tableUSINGsource_table[ [ AS ]alias] ONmatch_condition[ WHEN MATCHED THEN { UPDATE SETcol_name= {expr} [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ (col_name[,...] ) ] VALUES ( {expr} [, ...] ) | REMOVE DUPLICATES ]
Anda juga dapat menggunakan notasi tiga bagian untuk bucket tabel S3:
MERGE INTO "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name>USINGsource_table[ [ AS ]alias] ONmatch_condition[ WHEN MATCHED THEN { UPDATE SETcol_name= {expr} [,...] | DELETE } WHEN NOT MATCHED THEN INSERT [ (col_name[,...] ) ] VALUES ( {expr} [, ...] ) | REMOVE DUPLICATES ]
Dapat direferensikan menggunakan target_iceberg_table formulir, atau menggunakan notasi 3 bagian untuk katalog yang dipasang secara otomatis. Lihat Mereferensikan tabel Gunung Es di Amazon Redshift.<external_schema>.<external_table_name>
Bisa berupa tabel Iceberg atau tabel Amazon Redshift RMS.source_table
Saat REMOVE DUPLICATES digunakan, MERGE perintah menggunakan mode yang disederhanakan. Untuk detail lebih lanjut tentang mode yang disederhanakan, silakan merujuk ke dokumen MERGE perintah asli.
Saat menjalankan MERGE kueri, Amazon Redshift menghasilkan dan menyimpan file data perantara di lokasi tabel target. File-file ini akan menjadi sampah yang dikumpulkan di akhir kueri. Karena itu, MERGE kueri akan memerlukan DELETE izin di bucket Amazon S3 agar berfungsi dengan baik. Kesalahan izin yang tidak memadai akan terjadi jika operasi pengumpulan sampah gagal. Untuk tabel Amazon S3, pengumpulan sampah dikelola oleh layanan tabel Amazon S3. Oleh karena itu DELETE izin tidak diperlukan untuk mengeksekusi MERGE query.
MEJA DROP
Untuk menghapus tabel Iceberg dari katalog, gunakan perintah: DROP TABLE
DROP TABLE<external_schema>.<table_name>
Anda juga dapat menggunakan notasi tiga bagian dengan katalog yang dipasang secara otomatis:
DROP TABLE "<catalog_name>".<database_name>.<table_name>
Menjatuhkan tabel Iceberg adalah operasi metadata saja. Ini menghapus entri tabel dari AWS Glue Data Catalog dan katalog tabel Amazon S3, jika ini adalah tabel Amazon S3. Amazon Redshift tidak membersihkan atau menghapus file data atau file metadata yang ada di bawah lokasi tabel. Anda dapat menggunakan fitur dalam AWS Glue dan tabel Amazon S3 untuk menghapus file yatim piatu. Untuk AWS Glue, lihat Menghapus file yatim piatu. Untuk tabel Amazon S3, lihat Pemeliharaan tabel.