Bekerja dengan tabel Iceberg dengan menggunakan Trino - AWS Bimbingan Preskriptif

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

Bagian ini menjelaskan cara mengatur dan mengoperasikan tabel Iceberg dengan menggunakan Trino di Amazon 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

  1. Buat iceberg.properties file dengan konten berikut. iceberg.file-format=parquetPengaturan 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
  2. Unggah file iceberg.properties ke bucket S3 Anda. 

  3. 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
  4. 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 Wilayah AWS

    • <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

    • <EMR-EC2-instance-profile>dengan profil instans Anda. 

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

    trino-cli
  6. Di Trino CLI, Anda dapat melihat katalog dengan menjalankan:

    SHOW CATALOGS;

Membuat tabel Iceberg

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

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

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

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

Iceberg menyediakan akses ke metadata-nya melalui SQL. Anda dapat mengakses metadata untuk tabel tertentu (<table_name>) dengan menanyakan namespace. "<table_name>.$<metadata_table>" Untuk daftar lengkap tabel metadata, lihat Memeriksa tabel 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.

Menggunakan perjalanan waktu

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 spesifiksnapshot_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

Operasi penulisan Trino pada tabel Iceberg mengikuti merge-on-readdesain, 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.