View a markdown version of this page

テーブル定義の変更 - Amazon Redshift

Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、ブログ記事を参照してください。

テーブル定義の変更

ALTER TABLE ステートメントは、スキーマ、パーティション仕様、プロパティなど、テーブル定義を変更するために使用します。これらの DDL ステートメントを使用して、Amazon Redshift を介して Iceberg テーブルを直接管理できます。

すべての ALTER TABLE ステートメントは、Iceberg テーブルの外部スキーマ参照または 3 つの部分からなる表記参照の使用をサポートしています。以下の構文例では、iceberg_table は次のいずれかになります。

-- External schema notation: <external_schema>.<table_name> -- Three-part notation for S3 table buckets: "<table_bucket_name>@s3tablescatalog".<database_name>.<table_name> -- Three-part notation for the awsdatacatalog root catalog: awsdatacatalog.<database_name>.<table_name>

詳細については、「Amazon Redshift での Iceberg テーブルの参照」を参照してください。

ALTER TABLE ステートメントを使用するときは、次のことを検討してください。

  • ALTER TABLE ステートメントは現在 Iceberg v2 テーブルのみをサポートしています。

  • すべての ALTER TABLE ステートメントはメタデータのみのオペレーションです。

  • ALTER TABLE ステートメントは、複雑な型の列を持つテーブルをサポートしていません。

ALTER TABLE RENAME COLUMN

ALTER TABLE iceberg_table RENAME [COLUMN] col_name TO new_name;

ALTER TABLE RENAME COLUMN は既存の列の名前を変更します。col_name には、パーティション列またはパーティション化されていない列のいずれも指定できます。名前を変更した後、列のデータ型とパーティション仕様は変更されません。

注記

ALTER TABLE RENAME COLUMN は、AWS Lake Formation に登録されたテーブルではサポートされていません。

ALTER TABLE ADD/DROP COLUMN

ALTER TABLE iceberg_table ADD [COLUMN] col_name col_type;
ALTER TABLE iceberg_table DROP [COLUMN] col_name;

ADD COLUMN は既存の Iceberg テーブルに 1 つの列を追加します。Amazon Redshift Iceberg の書き込みでサポートされている任意のデータ型を使用できます。詳細については、「Apache Iceberg テーブルでサポートされているデータ型」を参照してください。

ADD COLUMN はメタデータのみのオペレーションです。既存の行に新しく追加された列の値は NULL です。

DROP COLUMN は既存の Iceberg テーブルから列を削除します。パーティションテーブルの場合、現在のパーティション仕様に属する列を削除することはできません。列を削除する前に、最初に列を含むパーティションフィールドを削除する必要があります。詳細については、「ALTER TABLE ADD、DROP、および REPLACE PARTITION FIELD」を参照してください。

ALTER TABLE ALTER COLUMN

ALTER TABLE iceberg_table ALTER COLUMN column_name TYPE updated_data_type;

ALTER TABLE ALTER COLUMN は既存の列のデータ型を変更します。型の拡張のみが許可され、縮小はできません。データは ALTER の後に書き換えられないため、データ型を縮小すると、既存のテーブルデータを消費するときにオーバーフローが発生する可能性があるためです。Iceberg 仕様では、次のタイプの拡張が許可されています。

int → bigint float → double decimal(P, S) → decimal(P2, S) where P2 > P (scale cannot be changed)

Amazon Redshift では、データ型にエイリアスを含めることができます。例えば、4 バイトの整数はタイプ名 int または int4 を使用します。Iceberg タイプの 4 バイト int にマッピングされている限り、8 バイト整数への型拡張が許可されます。

例えば、Iceberg テーブルは 4 バイトの整数型を使用して作成されます。

CREATE TABLE iceberg_table (cint int) USING ICEBERG LOCATION 's3://your-bucket-name/prefix/';

これは、次の ALTER ステートメントによって拡張できます。

ALTER TABLE iceberg_table ALTER COLUMN cint TYPE int8;

Amazon Redshift タイプと Iceberg タイプ間のデータ型マッピングの完全なリストについては、「Apache Iceberg テーブルでサポートされているデータ型」を参照してください。

既存のパーティション仕様に属する列の型の拡張はサポートされていません。

ALTER TABLE SET TABLE PROPERTIES

ALTER TABLE iceberg_table SET TABLE PROPERTIES ( 'compression_type' = 'compression_value');

このステートメントでは、デフォルトのテーブルプロパティを上書きできます。現在、このステートメントで許可されるテーブルプロパティは compression_type のみです。Iceberg テーブルの Parquet ファイルに対して別の圧縮タイプを使用するように上書きできます。ALTER の後に挿入されたデータは、新しい圧縮タイプを使用します。

compression_type の想定される値は、brotligzipsnappyuncompressedzstd です。

ALTER TABLE ADD、DROP、および REPLACE PARTITION FIELD

ALTER TABLE iceberg_table ADD PARTITION FIELD column_name | transform_function;
ALTER TABLE iceberg_table DROP PARTITION FIELD column_name | transform_function;
ALTER TABLE iceberg_table REPLACE PARTITION FIELD column_name | transform_function WITH column_name | transform_function;

[ADD | DROP | REPLACE] PARTITION FIELD ステートメントを使用すると、既存のテーブルパーティション仕様を変更し、Amazon Redshift によるパーティションの進化をサポートできます。

パーティション仕様の ALTER ステートメントはテーブルメタデータのみを変更し、既存のテーブルデータを再パーティション化しません。ALTER の後、テーブルに挿入された新しいデータは、新しく定義されたパーティション仕様に従います。

これらのステートメントには、次の制限事項を考慮してください。

  • ADD または REPLACE ... WITH ... を使用して新しいパーティションフィールドを定義する場合、新しいフィールドには、既に他のパーティションフィールドの一部である列を含めることはできません。これは、CREATE TABLE で最初のパーティション仕様を定義する場合と同じ制限です。詳細については、「CREATE TABLE」を参照してください。

    例えば、以下のテーブルがある場合:

    CREATE TABLE iceberg_table ... PARTITIONED BY year(ship_date) USING ICEBERG ...;

    ship_date が既存のパーティションフィールドの一部になっているため、以下は失敗します。

    ALTER TABLE iceberg_table ADD PARTITION FIELD bucket(128, ship_date);
  • 新しいパーティションフィールドを追加する場合、新しく追加されたフィールドは常にテーブルのパーティションの最終レベルとして扱われます。例えば、次のようになります。

    CREATE TABLE iceberg_table ... PARTITIONED BY year(ship_date) USING ICEBERG ...; ALTER TABLE iceberg_table ADD PARTITION FIELD bucket(256, item_id);

    テーブルパーティション仕様は以下と同じです。

    CREATE TABLE iceberg_table ... PARTITIONED BY (year(ship_date), bucket(256, item_id)) USING ICEBERG ...;
  • パーティションフィールドを削除する場合、パーティションの最後のレベルに制限されません。既存の任意のパーティションフィールドを削除できます。例えば、次のようになります。

    CREATE TABLE iceberg_table ... PARTITIONED BY (year(ship_date), bucket(256, item_id)) USING ICEBERG ...; ALTER TABLE iceberg_table DROP PARTITION FIELD year(ship_date);

    この ALTER の後、テーブルは bucket(256, item_id) によってのみパーティション化されます。

  • REPLACE PARTITION FIELD ... WITH ... を呼び出す場合、置き換えるパーティションフィールドは仕様内の任意のフィールドであり、最後のフィールドに限定されません。例えば、次のようになります。

    CREATE TABLE iceberg_table ... PARTITIONED BY (year(ship_date), bucket(256, item_id)) USING ICEBERG ...; ALTER TABLE iceberg_table REPLACE PARTITION FIELD year(ship_date) WITH month(ship_date);

    この ALTER の後、テーブルパーティションは (month(ship_date), bucket(256, item_id)) になります。

  • void 変換はパーティション ALTER ステートメントではサポートされていません。