

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Trino を使用した Iceberg テーブルの操作
<a name="iceberg-trino"></a>

このセクションでは、[Amazon EMR](https://docs.aws.amazon.com/emr/) で [Trino](https://trino.io/docs/current/) を使用して Iceberg テーブルをセットアップおよび操作する方法について説明します。例は、EC2 クラスター上の Amazon EMR で実行できる定型コードです。このセクションのコード例と設定は、Amazon EMR リリース **emr-7.9.0** を使用していることを前提としています。

## EC2 での Amazon EMR のセットアップ
<a name="trino-emr-setup"></a>

1. 以下のコンテンツを含む `iceberg.properties` ファイルを作成します。`iceberg.file-format=parquet` 設定は、 `CREATE TABLE` ステートメントで形式が明示的に指定されていない場合に、新しいテーブルのデフォルトのストレージ形式を決定します。

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

1. `iceberg.properties` ファイルを S3 バケットにアップロードします。 

1. S3 バケットから`iceberg.properties` ファイルをコピーし、作成する Amazon EMR クラスターに Trino 設定ファイルとして保存するブートストラップアクションを作成します。 を S3 バケット名`<S3-bucket-name>` に置き換えてください。 

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

1. Trino がインストールされた Amazon EMR クラスターを作成し、ブートストラップアクションとして前のスクリプトの実行を指定します。クラスターを作成するための sample AWS Command Line Interface (AWS CLI) コマンドを次に示します。

   ```
   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>"}'
   ```

   を置き換える場所:
   + `<S3-bucket-name>` S3 バケット名
   + `<region>` 特定の AWS リージョン
   + `<key-name>` キーペアを使用します。キーペアが存在しない場合は作成されます。
   + `<IAM-service-role>` [最小特権の原則に従う Amazon EMR ](https://aws.amazon.com/blogs/security/techniques-for-writing-least-privilege-iam-policies/)サービスロール。 
   + `<EMR-EC2-instance-profile>` [インスタンスプロファイル](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-ranger-iam-ec2.html)を使用します。 

1. Amazon EMR クラスターが初期化されたら、次のコマンドを実行して Trino セッションを初期化できます。

   ```
   trino-cli
   ```

1. Trino CLI では、以下を実行してカタログを表示できます。

   ```
   SHOW CATALOGS;
   ```

## Iceberg テーブルの作成
<a name="trino-create-table"></a>

Iceberg テーブルを作成するには、 `CREATE TABLE`ステートメントを使用できます。  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>');
```

**注記**  
形式を指定しない場合、前のセクションで設定した`iceberg.file-format`値が使用されます。

データを挿入するには、 `INSERT INTO` コマンドを使用します。例を示します。

```
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');
```

## Iceberg テーブルからの読み取り
<a name="trino-read-data"></a>

次のように、 `SELECT`ステートメントを使用して Iceberg テーブルの最新のステータスを読み取ることができます。

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

## Iceberg テーブルへのデータの更新
<a name="trino-upsert-data"></a>

`MERGE INTO` ステートメントを使用して、アップサートオペレーション (同時に新しいレコードを挿入し、既存のレコードを更新) を実行できます。例を示します。

```
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);
```

## Iceberg テーブルからのレコードの削除
<a name="trino-delete-data"></a>

Iceberg テーブルからデータを削除するには、 `DELETE FROM`式を使用して、削除する行に一致するフィルターを指定します。例を示します。

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

## Iceberg テーブルデータのクエリの実行
<a name="trino-query-metadata"></a>

Iceberg は SQL を介してメタデータへのアクセスを提供します。名前空間 をクエリすることで、任意のテーブル (`<table_name>`) のメタデータにアクセスできます`"<table_name>.$<metadata_table>"`。メタデータテーブルの完全なリストについては、Iceberg ドキュメントの[「テーブルの検査](https://iceberg.apache.org/docs/latest/spark-queries/#inspecting-tables)」を参照してください。

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";
```

例えば、次のクエリは、

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

は出力を提供します。

![Iceberg テーブルメタデータのクエリからの出力。](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/apache-iceberg-on-aws/images/querying-metadata-trino.png)


## タイムトラベルの使用
<a name="trino-time-travel"></a>

Iceberg テーブル内の書き込みオペレーション (挿入、更新、アップサート、または削除) ごとに、新しいスナップショットが作成されます。その後、これらのスナップショットをタイムトラベルに使用できます。タイムトラベルをさかのぼって、過去のテーブルのステータスを確認できます。

次のタイムトラベルクエリは、特定の に基づいてテーブルのステータスを表示します`snapshot_id`。

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

次のタイムトラベルクエリは、特定のタイムスタンプに基づいてテーブルのステータスを表示します。

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

## Trino で Iceberg を使用する場合の考慮事項
<a name="trino-considerations"></a>

Iceberg テーブルに対する Trino 書き込みオペレーションは[merge-on-read](https://docs.aws.amazon.com/prescriptive-guidance/latest/apache-iceberg-on-aws/best-practices-write.html#write-update-strategy) 設計に従うため、更新または削除の影響を受けるデータファイル全体を書き換えるのではなく、位置削除ファイルを作成します。copy-on-write方式を使用する場合は、書き込みオペレーションに Spark を使用することを検討してください。 