

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

# Bekerja dengan tabel Iceberg dengan menggunakan Trino
<a name="iceberg-trino"></a>

[Bagian ini menjelaskan cara mengatur dan mengoperasikan tabel Iceberg dengan menggunakan [Trino di](https://trino.io/docs/current/) Amazon EMR.](https://docs.aws.amazon.com/emr/) Contohnya adalah kode boilerplate yang dapat Anda jalankan di EMR Amazon di cluster EC2. **Contoh kode dan konfigurasi di bagian ini mengasumsikan bahwa Anda menggunakan Amazon EMR rilis emr-7.9.0.**

## Amazon EMR pada pengaturan EC2
<a name="trino-emr-setup"></a>

1. Buat `iceberg.properties` file dengan konten berikut. `iceberg.file-format=parquet`Pengaturan menentukan format penyimpanan default untuk tabel baru jika format tidak secara eksplisit ditentukan dalam pernyataan. `CREATE TABLE`

   ```
   connector.name=iceberg
   iceberg.catalog.type=glue
   iceberg.file-format=parquet
   fs.native-s3.enabled=true
   ```

1. Unggah file `iceberg.properties` ke bucket S3 Anda. 

1. Buat tindakan bootstrap yang menyalin `iceberg.properties` file dari bucket S3 Anda dan menyimpannya sebagai file konfigurasi Trino di cluster EMR Amazon yang akan Anda buat. Pastikan untuk mengganti `<S3-bucket-name>` dengan nama bucket S3 Anda. 

   ```
   #!/bin/bash
   set -ex
   sudo aws s3 cp s3://<S3-bucket-name>/iceberg.properties /etc/trino/conf/catalog/iceberg.properties
   ```

1. Buat cluster EMR Amazon dengan Trino diinstal dan tentukan eksekusi skrip sebelumnya sebagai tindakan bootstrap. Berikut adalah contoh AWS Command Line Interface (AWS CLI) perintah untuk membuat cluster:

   ```
   aws emr create-cluster --release-label emr-7.9.0 \
   --applications Name=Trino \
   --region <region> \
   --name Trino_Iceberg_Cluster \
   --bootstrap-actions '[{"Path":"s3://<S3-bucket-name>/bootstrap.sh","Name":"Add iceberg.properties"}]' \
   --instance-groups '[{"InstanceGroupType":"MASTER","InstanceCount":1,"InstanceType":"m5.xlarge"},{"InstanceGroupType":"CORE","InstanceCount":3,"InstanceType":"m5.xlarge"}]' \
   --service-role "<IAM-service-role>" \
   --ec2-attributes '{"KeyName":"<key-name>","InstanceProfile":"<EMR-EC2-instance-profile>"}'
   ```

   di mana Anda mengganti:
   + `<S3-bucket-name>`dengan nama bucket S3 Anda
   + `<region>`dengan spesifik Anda AWS Region
   + `<key-name>`dengan key pair Anda. Jika key pair tidak ada, maka akan dibuat.
   + `<IAM-service-role>`dengan peran layanan EMR Amazon Anda yang mengikuti [prinsip hak istimewa paling sedikit](https://aws.amazon.com/blogs/security/techniques-for-writing-least-privilege-iam-policies/). 
   + `<EMR-EC2-instance-profile>`dengan [profil instans](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-ranger-iam-ec2.html) Anda. 

1. Ketika klaster EMR Amazon telah diinisialisasi, Anda dapat menginisialisasi sesi Trino dengan menjalankan perintah berikut:

   ```
   trino-cli
   ```

1. Di Trino CLI, Anda dapat melihat katalog dengan menjalankan:

   ```
   SHOW CATALOGS;
   ```

## Membuat tabel Iceberg
<a name="trino-create-table"></a>

Untuk membuat tabel Iceberg, Anda dapat menggunakan pernyataan tersebut. `CREATE TABLE`  Berikut adalah contoh pembuatan tabel yang dipartisi yang menggunakan partisi tersembunyi Iceberg:

```
CREATE TABLE iceberg.iceberg_db.iceberg_table (
             userid int,
             firstname varchar,
             city varchar)
        WITH (
             format = 'PARQUET',
             partitioning = ARRAY['city', 'bucket(userid, 16)'],
             location = 's3://<S3-bucket>/<prefix>');
```

**catatan**  
Jika Anda tidak menentukan format, `iceberg.file-format` nilai yang Anda konfigurasikan di bagian sebelumnya akan digunakan.

Untuk memasukkan data, gunakan `INSERT INTO` perintah. Inilah contohnya:

```
INSERT INTO iceberg.iceberg_db.iceberg_table (userid, firstname, city)
VALUES 
    (1001, 'John', 'New York'),
    (1002, 'Mary', 'Los Angeles'),
    (1003, 'Mateo', 'Chicago'),
    (1004, 'Shirley', 'Houston'),
    (1005, 'Diego', 'Miami'),
    (1006, 'Nikki', 'Seattle'),
    (1007, 'Pat', 'Boston'),
    (1008, 'Terry', 'San Francisco'),
    (1009, 'Richard', 'Denver'),
    (1010, 'Pat', 'Phoenix');
```

## Membaca dari tabel Iceberg
<a name="trino-read-data"></a>

Anda dapat membaca status terbaru dari tabel Iceberg Anda dengan menggunakan `SELECT` pernyataan, sebagai berikut:

```
SELECT * FROM iceberg.iceberg_db.iceberg_table;
```

## Menambah data ke dalam tabel Iceberg
<a name="trino-upsert-data"></a>

Anda dapat melakukan operasi upsert (secara bersamaan menyisipkan catatan baru dan memperbarui yang sudah ada) dengan menggunakan `MERGE INTO` pernyataan. Inilah contohnya:

```
MERGE INTO iceberg.iceberg_db.iceberg_table target
USING (
      VALUES 
        (1001, 'John Updated', 'Boston'),       -- Update existing user
        (1002, 'Mary Updated', 'Seattle'),      -- Update existing user
        (1011, 'Martha', 'Portland'),           -- Insert new user
        (1012, 'Paulo', 'Austin')               -- Insert new user
    ) AS source (userid, firstname, city)
   ON target.userid = source.userid
 WHEN MATCHED THEN
      UPDATE SET 
        firstname = source.firstname,
        city = source.city
 WHEN NOT MATCHED THEN
      INSERT (userid, firstname, city)
      VALUES (source.userid, source.firstname, source.city);
```

## Menghapus catatan dari tabel Iceberg
<a name="trino-delete-data"></a>

Untuk menghapus data dari tabel Iceberg, gunakan `DELETE FROM` ekspresi dan tentukan filter yang cocok dengan baris yang akan dihapus. Inilah contohnya:

```
DELETE FROM iceberg.iceberg_db.iceberg_table WHERE userid IN (1003, 1004);
```

## Menanyakan metadata tabel Iceberg
<a name="trino-query-metadata"></a>

Iceberg menyediakan akses ke metadata-nya melalui SQL. Anda dapat mengakses metadata untuk setiap tabel yang diberikan (`<table_name>`) dengan menanyakan namespace. `"<table_name>.$<metadata_table>"` Untuk daftar lengkap tabel metadata, lihat [Memeriksa tabel](https://iceberg.apache.org/docs/latest/spark-queries/#inspecting-tables) dalam dokumentasi Gunung Es.

Berikut adalah contoh daftar kueri untuk memeriksa metadata Iceberg:

```
SELECT  FROM iceberg.iceberg_db."iceberg_table$snapshots";
SELECT  FROM iceberg.iceberg_db."iceberg_table$history";
SELECT  FROM iceberg.iceberg_db."iceberg_table$partitions";
SELECT  FROM iceberg.iceberg_db."iceberg_table$files";
SELECT  FROM iceberg.iceberg_db."iceberg_table$manifests";
SELECT  FROM iceberg.iceberg_db."iceberg_table$refs";
SELECT * FROM iceberg.iceberg_db."iceberg_table$metadata_log_entries";
```

Misalnya, kueri ini: 

```
 SELECT * FROM iceberg.iceberg_db."iceberg_table$snapshots";
```

menyediakan output:

![Keluaran dari kueri metadata tabel Iceberg.](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/apache-iceberg-on-aws/images/querying-metadata-trino.png)


## Menggunakan perjalanan waktu
<a name="trino-time-travel"></a>

Setiap operasi tulis (menyisipkan, memperbarui, meningkatkan, atau menghapus) dalam tabel Iceberg membuat snapshot baru. Anda kemudian dapat menggunakan snapshot ini untuk perjalanan waktu — untuk kembali ke masa lalu dan memeriksa status tabel di masa lalu.

Kueri perjalanan waktu berikut menampilkan status tabel berdasarkan spesifik`snapshot_id`:

```
SELECT *
FROM iceberg.iceberg_db.iceberg_table FOR VERSION AS OF 241938428756831817;
```

Kueri perjalanan waktu berikut menampilkan status tabel berdasarkan stempel waktu tertentu:

```
SELECT *
FROM iceberg.iceberg_db.iceberg_table FOR TIMESTAMP AS OF TIMESTAMP '2025-05-28 16:09:40.268 UTC'
```

## Pertimbangan saat menggunakan Iceberg dengan Trino
<a name="trino-considerations"></a>

Operasi penulisan Trino pada tabel Iceberg mengikuti [merge-on-read](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/best-practices-write.html#write-update-strategy)desain, sehingga mereka membuat file hapus posisi alih-alih menulis ulang seluruh file data yang dipengaruhi oleh pembaruan atau penghapusan. Jika Anda ingin menggunakan copy-on-write pendekatan ini, pertimbangkan untuk menggunakan Spark untuk operasi tulis. 