

 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](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

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

# Perintah SQL
<a name="iceberg-writes-sql-syntax"></a>

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 `DELETE``UPDATE`,, dan `MERGE` perintah. Semua pernyataan SQL lainnya, seperti`ALTER 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.

**Contents**
+ [CREATE TABLE](#iceberg-writes-create-table)
+ [BUAT TABEL SEBAGAI PILIH](#iceberg-writes-create-table-as-select)
+ [TAMPILKAN TABEL](#iceberg-writes-show-table)
+ [MASUKKAN KE](#iceberg-writes-insert-into)
+ [DELETE](#iceberg-writes-delete)
+ [UPDATE](#iceberg-writes-update)
+ [MERGE](#iceberg-writes-merge)
+ [MEJA DROP](#iceberg-writes-drop-table)

## CREATE TABLE
<a name="iceberg-writes-create-table"></a>

```
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 `{{<external_schema>}}` 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](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html) di dokumentasi Amazon Redshift.

`LOCATION`Klausa 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](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/best-practices-workloads.html#workloads-replication).

`PARTITIONED BY`mendefinisikan 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](https://iceberg.apache.org/spec/#partition-transforms) Apache Iceberg.

`PARTITIONED BY`Mendukung 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 PROPERTIES`Klausa 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`, dan`uncompressed`.

**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
<a name="iceberg-writes-create-table-as-select"></a>

```
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 TABLE`Klausa 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
<a name="iceberg-writes-show-table"></a>

```
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 TABLE`menampilkan `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 menggunakan`INSERT INTO`:

## MASUKKAN KE
<a name="iceberg-writes-insert-into"></a>

```
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 oleh`column_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
<a name="iceberg-writes-delete"></a>

`DELETE`Kueri 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, ...}} ] [ WHERE {{condition}} ]
```

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, ...}} ] [ WHERE {{condition}} ]
```

`{{iceberg_table}}`Dapat direferensikan menggunakan `{{<external_schema>}}.{{<external_table_name>}}` formulir, atau menggunakan notasi 3 bagian untuk katalog yang dipasang secara otomatis. Lihat [Mereferensikan tabel Iceberg di Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/referencing-iceberg-tables.html).

`{{table_name}}`Dalam `USING` klausa akan digunakan untuk bergabung dengan tabel target untuk menghapus baris yang puas dengan kondisi. `WHERE` Itu `{{table_name}}` bisa berupa tabel Iceberg atau tabel Amazon Redshift RMS.

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
<a name="iceberg-writes-update"></a>

Sintaks `UPDATE` query untuk tabel Iceberg sangat mirip dengan `UPDATE` sintaks yang ada untuk tabel RMS:

```
[ WITH [RECURSIVE] {{common_table_expression}} [, {{common_table_expression}} , ...] ]
UPDATE {{iceberg_table}} [ [ AS ] alias ] SET column = { {{expression}} } [,...]
[ FROM {{fromlist}} ]
[ WHERE {{condition}} ]
```

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}} } [,...]
[ FROM {{fromlist}} ]
[ WHERE {{condition}} ]
```

`{{iceberg_table}}`Dapat direferensikan menggunakan `{{<external_schema>}}.{{<external_table_name>}}` formulir, atau menggunakan notasi 3 bagian untuk katalog yang dipasang secara otomatis. Lihat [Mereferensikan tabel Gunung Es di Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/referencing-iceberg-tables.html).

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.

`UPDATE`juga 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](https://docs.aws.amazon.com/redshift/latest/dg/r_error_on_nondeterministic_update.html).

## MERGE
<a name="iceberg-writes-merge"></a>

`MERGE`Kueri secara kondisional menggabungkan baris dari tabel sumber ke dalam tabel target. Ini berbagi sintaks `MERGE` kueri yang sama dengan tabel RMS yang ada:

```
MERGE INTO {{target_iceberg_table}} USING {{source_table}} [ [ AS ] {{alias}} ]
ON {{match_condition}}
[ WHEN MATCHED THEN { UPDATE SET {{col_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>}} USING {{source_table}} [ [ AS ] {{alias}} ]
ON {{match_condition}}
[ WHEN MATCHED THEN { UPDATE SET {{col_name}} = { {{expr}} } [,...] | DELETE }
  WHEN NOT MATCHED THEN INSERT [ ( {{col_name}} [,...] ) ]
  VALUES ( { {{expr}} } [, ...] )
| REMOVE DUPLICATES ]
```

`{{target_iceberg_table}}`Dapat direferensikan menggunakan `{{<external_schema>}}.{{<external_table_name>}}` formulir, atau menggunakan notasi 3 bagian untuk katalog yang dipasang secara otomatis. Lihat [Mereferensikan tabel Gunung Es di Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/dg/referencing-iceberg-tables.html).

`{{source_table}}`Bisa berupa tabel Iceberg atau tabel Amazon Redshift RMS.

Saat `REMOVE DUPLICATES` digunakan, `MERGE` perintah menggunakan mode yang disederhanakan. Untuk detail lebih lanjut tentang mode yang disederhanakan, silakan merujuk ke [dokumen `MERGE` perintah](https://docs.aws.amazon.com/redshift/latest/dg/r_MERGE.html) 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
<a name="iceberg-writes-drop-table"></a>

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](https://docs.aws.amazon.com/glue/latest/dg/orphan-file-deletion.html). Untuk tabel Amazon S3, lihat Pemeliharaan [tabel](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-maintenance.html).