Apache Iceberg™ テーブル:Apache Iceberg™ v3のサポート(プレビュー

このプレビューでは、|iceberg-tm|仕様のv3のサポートが導入されていますが、いくつかの考慮事項と制限があります。特に明記されていない限り、このプレビューでは、Snowflake管理テーブルと外部管理Icebergテーブルの両方がサポートされています。

サポートされるIceberg v3の機能

このセクションでは、このプレビューでサポートされるIceberg v3の機能をリストします。

データ型

次のv3データ型が、パブリックプレビューでサポートされています。

  • geography

  • geometry

  • nanosecond

  • variant

詳細については、 Iceberg v3データ型 をご参照ください。

デフォルト値

:ref:`デフォルト値<label-tables_iceberg_default_values>`を参照してください。

削除ベクター

:ref:`削除ベクター<tables-iceberg-deletion-vectors>`を参照してください。

行系統

:ref:`行系統<label-tables_iceberg_row_lineage>`を参照してください。

デフォルトのIcebergバージョンを設定する

Icebergテーブルには、そのテーブルが準拠するフォーマットバージョンが本来的に備わっています。標準のSnowflakeデータベースで外部管理されているIcebergテーブルの場合、Snowflakeはテーブルのメタデータからこのバージョンを取得します。

以下のIcebergテーブルでは、テーブルの所有者は、テーブルが準拠するIcebergバージョンを指定する必要があります。

  • Snowflake管理Icebergテーブル

  • :doc:`カタログリンクデータベース</user-guide/tables-iceberg-catalog-linked-database>`で作成する外部管理Icebergテーブル

SnowflakeのシステムデフォルトのIceberg形式バージョンはv2ですが、必要に応じてv3に設定できます。Icebergバージョンをv3に設定するには、以下のいずれかのアクションを実行します。

  • ICEBERG_VERSION_DEFAULTパラメーターを使用して、アカウント、データベース、スキーマレベルでIcebergバージョンを:code:3`に設定します。詳細については、 :ref:`label-iceberg_version_default をご参照ください。

  • CREATE ICEBERG TABLEステートメントで:code:`ICEBERG_VERSION = 3`を指定します。

    注釈

    Icebergテーブルを作成するときにIcebergバージョンを指定しない場合、テーブルのデフォルトはスキーマ、データベース、アカウントに設定されたIcebergバージョンになります。スキーマはデータベースより優先され、データベースはアカウントより優先されます。

注意

他のエンジンを使用してテーブルプロパティのIcebergテーブルの形式バージョンをv3にアップグレードする前に、まだv3をサポートしていないエンジンやアプリケーションでテーブルが使用されていないことを確認してください。形式バージョンのダウングレードは、Apache Iceberg仕様ではサポートされていません。したがって、すべてのリーダーとライターはv3をサポートしている必要があります。SnowflakeのIcebergテーブルのデフォルトバージョンはv2です。これは、必要に応じてv3に構成できます。Snowflakeを使用したインプレースバージョンアップグレードの実行は、現時点ではサポートされていません。

使用上の注意

  • アカウントレベルでICEBERG_VERSION_DEFAULTパラメーターを変更するには、アカウント管理者である必要があります。つまり、ACCOUNTADMINロールを持つユーザーである必要があります。

  • データベースまたはスキーマレベルでICEBERG_VERSION_DEFAULTパラメーターを変更するには、操作の実行に使用されるロールに、それぞれのデータベースまたはスキーマに対するOWNERSHIP権限が必要です。

``my_db``データベース内の新しいIcebergテーブルがv3を使用して作成されるように指定します。

ALTER DATABASE my_db SET ICEBERG_VERSION_DEFAULT=3;
Copy

v3で新しい外部管理Icebergテーブルを作成します。コマンドに含まれる列定義は、リモートカタログで新しいテーブルが作成されるか、既存のテーブルが置換されることを示します。これは既存のバージョンを持たない新しいテーブルであるため、テーブルは正常に作成されます。

CREATE OR REPLACE ICEBERG TABLE my_iceberg_v3_table (
    boolean_col boolean,
    int_col int,
    long_col long,
  )
  CATALOG='my_catalog_integration'
  ICEBERG_VERSION=3;
Copy

Icebergメタデータを持つ既存のテーブルからv3で外部管理Icebergテーブルを作成します。この例で列定義または形式バージョンがないことは、このテーブルが既に存在し、列仕様と形式バージョンがリモートカタログのIcebergメタデータから推測されることを示しています。この例では:doc:`カタログ提供の認証情報</user-guide/tables-iceberg-configure-catalog-integration-vended-credentials>`を使用するため、EXTERNAL_VOLUMEパラメーターはCREATE ICEBERG TABLEステートメントから除外されます。

CREATE OR REPLACE ICEBERG TABLE my_iceberg_v3_table
  CATALOG = 'my_catalog_integration'
  CATALOG_TABLE_NAME = 'my_table'
  AUTO_REFRESH = TRUE;
Copy

注釈

既存のテーブルの形式バージョンを変更するためにALTER ICEBERG TABLEコマンドを使用することはできません。

Icebergテーブルの形式バージョンを取得する

  • 次の例は、特定のテーブルのIcebergバージョンを取得する方法を示しています。

    SHOW PARAMETERS LIKE 'ICEBERG_VERSION' IN TABLE my_v3_iceberg_table;
    
    Copy

    出力:

    +-----------------+-------+---------+-------+---------------------------------------------------+--------+
    | key             | value | default | level | description                                       | type   |
    +-----------------+-------+---------+-------+---------------------------------------------------+--------+
    | ICEBERG_VERSION | 3     | 2       | TABLE | Specifies the Iceberg table format version to ... | NUMBER |
    +-----------------+-------+---------+-------+---------------------------------------------------+--------+
    
  • 次の例は、:doc:`/sql-reference/functions/get_ddl`関数を使用してIcebergテーブル定義を取得することにより、特定のテーブルのIcebergバージョンを取得する方法を示しています。

    SELECT GET_DDL('ICEBERG_TABLE', 'my_v3_iceberg_table');
    
    Copy

    出力:

     CREATE ICEBERG TABLE my_v3_iceberg_table (
      record VARIANT,
      event_timestamp TIMESTAMP_LTZ(6)
    )
      CATALOG = 'SNOWFLAKE'
      EXTERNAL_VOLUME = 'my_external_volume'
      BASE_LOCATION = 'my_iceberg_table'
      ICEBERG_VERSION = 3;
    

Iceberg v3機能の考慮事項と制限

Iceberg v3の機能を使用する場合は、以下の情報を考慮してください。

サポートされていないSnowflake機能

以下のSnowflake機能は、Iceberg v3のこのプレビューではサポートされていません。

  • 外部管理Icebergテーブルの追加専用ストリーム

  • Snowflakeでのdbtプロジェクト

  • スキーマ推論

  • Snowpipe Streaming classic architecture

  • SnowGov リージョン

  • 外部カタログを使用するテーブルの場合、OBJECT、ARRAY、MAPのいずれかを含む構造化された型の列を持つIceberg v3テーブルを作成することができません。たとえば、CREATE ICEBERG TABLE … AS SELECT (CTAS)を使用して、構造化された型の列を持つ外部管理Iceberg v3テーブルを作成することができません。

    構造化された型の列を持つSnowflake管理Iceberg v3テーブルを作成できます。

  • Snowflake管理Icebergテーブルのv2からv3へのインプレースアップグレード。これには、v2テーブルのクローン作成と、クローンのv3へのアップグレードが含まれます。

    重要

    Apache Sparkを使用して外部管理Icebergテーブルをv2からv3にアップグレードする場合は、DML操作など、新しいスナップショットを作成するコミットを使用する必要があります。それ以外の場合は、新しいスナップショットなしでテーブルプロパティで形式バージョンが更新された場合、新しいスナップショットが作成されるまで、テーブルのSnowflakeの手動および自動更新は失敗します。

    以下の例ではApache Sparkを使用して、外部管理Icebergテーブルをv2からv3にアップグレードします。

    ALTER TABLE table_name SET TBLPROPERTIES('format-version'='3');
    
    Copy

注釈

  • サポートされない機能のリストは確定されておらず、将来変更される可能性があります。リストは、必要に応じて更新され、サポートされていない機能の最新状況が反映されます。

  • v3機能に固有の考慮事項と制限については、機能の:ref:`機能トピック<label-apache_iceberg_specification_supported_v3_features>`を参照してください。

サポートされているSnowflake機能

:ref:`サポートされていないSnowflake機能<label-tables_iceberg_v3_unsupported_features>`セクションに記載されていない機能は、サポートされています。サポートされている機能には、以下のリストのものが含まれています。

機能

メモ

リストの自動フルフィルメント

自動更新

カタログの統合

カタログリンクデータベース

クローニング

クラスタリング

Snowflake管理Iceberg v3のみ。

外部管理v3テーブルのSnowflake管理への変換

次の考慮事項でサポートされています。

  • v3 Icebergテーブルを変換しても、Icebergのパーティションはそのまま残ります。

  • Snowflakeは、変換前に作成されたメタデータ、マニフェストリスト、マニフェストを外部ストレージから削除しません。

  • 変換中に、SnowflakeはメタデータやParquetデータファイルを書き換えることはありません。

  • 変換後、Snowflakeはテーブルのライフサイクル管理を完全に担当するカタログになります。Snowflakeは、期限切れになって保持期間を過ぎると、外部ストレージから変換前または変換後に作成されたメタデータ、マニフェストリスト、マニフェスト、データファイルを削除します。

COPY INTO <テーブル>

LOAD_MODE = FULL_INGESTまたはADD_FILES COPYは以下の点を考慮してサポートされています。

  • Parquetファイル(_row_id`および:code:`_last_updated_sequence_number)の行系統メタデータ列をロードするには、FULL_INGESTオプションを使用する必要があります。そのほかのLOAD_MODEメソッドはサポートされていません。ただし、行系統を含むParquetファイルは、おそらくすでにIceberg v3テーブルの一部になっています。を使用したParquetファイルの登録ADD_FILES_COPYこれらのファイルがすでに別のIcebergテーブルの一部になっている場合は、の使用が推奨されません。ファイルを書き換えずに、外部管理のIcebergテーブルをSnowflake管理のIcebergテーブルに変換するためのベストプラクティスは、:doc:`/sql-reference/sql/alter-iceberg-table-convert-to-managed`コマンドを使用することです。

COPY INTO <場所>

次の制限でサポートされています。

  • VARIANT、GEOMETRYおよびGEOGRAPHYは、JSONでエンコードされた文字列としてアンロードされます。

  • TIMESTAMP_NTZ(9)はナノ秒ではなく、ミリ秒としてアンロードされます。

  • TIMESTAMP_LTZ(9)、ARRAY、OBJECT、MAPは他のデータ型にキャストする必要があります。

データクリーンルーム

データ系統

データ保護ポリシー

次のデータ保護ポリシーがサポートされています。

  • マスキングポリシー

  • 行アクセスポリシー

  • 投影ポリシー

  • 集計ポリシー

  • プライバシーポリシー

  • 結合ポリシー

Apache Sparkからのデータ保護ポリシーの適用

データ品質モニタリング

動的テーブル

v3外部管理Icebergテーブルを動的テーブルのターゲットとして書き込みます。

Horizon Iceberg RESTカタログAPI

LOB(大きなオブジェクト)

マテリアライズドビュー

オブジェクトのタグ付け

クエリアクセラレーション

Replication

検索最適化

セキュアビュー

機密データの分類

ターゲットファイルサイズ

単一引数のIcebergパーティショニング

パーティション化されたテーブルは削除ベクターも書き込めません。パーティション化されたテーブルでは書き込み時コピーのみがサポートされています。

Kafka用のSnowflakeコネクタ。

バージョン4.0以降。

Snowpark

1.33.0以降。

Snowpark pandas APIメソッド`to_iceberg<https://docs.snowflake.com/en/developer-guide/snowpark/reference/python/1.45.0/modin/pandas_api/modin.pandas.to_iceberg>`_

ICEBERG_VERSION_DEFAULTがアカウント、データベース、スキーマで設定されている場合にのみ、Iceberg v3でサポートされます。ICEBERG_VERSION = 3がテーブルレベルで設定されている場合、Snowpark pandas APIメソッドto_icebergはサポートされていません。

Snowpark Connect for Apache Spark

追加または上書きメソッドを使用した、既存のIceberg v3テーブルへのデータフレームの書き込みがサポートされています。新しいIceberg v3 テーブルの作成はサポートされていません。

Snowpipe

Snowpipe Streaming high-performance architecture

共有

ストリーム

  • 追加専用ストリームと標準ストリームは、Snowflake管理Iceberg v3テーブルでサポートされています。

  • 外部管理Iceberg v3テーブルでは、挿入専用ストリームと標準ストリームがサポートされています。

    • 標準ストリームが正しい結果を生成するようにするには、外部エンジンはIceberg v3の仕様に従ってIceberg v3テーブルに書き込む必要があります。具体的には、新しく挿入された行には:code:`_row_id=NULL`が必要です。書き込み時コピー中にコピーされた行は、:code:`_row_id`を維持する必要があります。

    • MAX_DATA_EXTENSION_TIME_IN_DAYSは外部管理Iceberg v3テーブルでは機能しません。

  • DMLsが複数ステートメントのトランザクションでコミットされる場合、Iceberg v3テーブルの追加専用ストリームは、Iceberg v2テーブルと比較して異なるセマンティクスを持ちます。

    • Iceberg v2では、追加専用ストリームにおいて、複数ステートメントのトランザクションで行が追加されてから削除された場合、この行は挿入とみなされます。

    • Iceberg v3では、追加専用ストリームにおいて、この行は挿入として扱われません。

テーブル最適化

サポートされていないIceberg v3機能

Iceberg v3仕様の以下の機能はサポートされていません。

  • ネストされたバリアント

  • パーティショニングとソートのための複数引数変換

  • テーブル暗号化キー

  • UNKNOWN データ型

例:既存のSnowflake機能によるv3サポート

このセクションでは、v3でサポートされている既存のSnowflake機能の例を示します。機能リストには、Snowflake管理テーブルと外部管理テーブル(サポートされている場合)の例が含まれます。

Iceberg v3のこのプレビューでサポートされるSnowflake機能の完全なリストについては、:ref:`サポートされているSnowflake機能<label-iceberg_v3_supported_snowflake_features>`を参照してください。

v3 Icebergテーブルを作成する

次の例では、|iceberg-tm|仕様のv3に準拠したSnowflake管理の|iceberg-tm|テーブルを作成します。

CREATE ICEBERG TABLE my_v3_iceberg_table (
  record VARIANT,
  event_timestamp TIMESTAMP_LTZ(6)
)
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_external_volume'
  BASE_LOCATION = 'my_iceberg_table'
  ICEBERG_VERSION = 3;
Copy

次の例では、リモートのIcebergRESTカタログを使用し、|iceberg-tm|仕様のv3に準拠した|iceberg-tm|テーブルを作成します。

注釈

形式バージョンは外部カタログのメタデータですでに定義されており、Snowflakeはメタデータからこのバージョンを取得するため、コマンドで:code:`ICEBERG_VERSION = 3`を指定する必要はありません。

CREATE ICEBERG TABLE my_v3_iceberg_table
  EXTERNAL_VOLUME = 'my_external_volume'
  CATALOG = 'my_rest_catalog_integration'
  CATALOG_TABLE_NAME = 'my_remote_table'
  AUTO_REFRESH = TRUE;
Copy

次の例では、列定義を持ち、|iceberg-tm|仕様のv3に準拠した書き込み可能なIcebergテーブルを:doc:`カタログリンクデータベース</user-guide/tables-iceberg-catalog-linked-database>`に作成します。

USE DATABASE my_catalog_linked_db;

USE SCHEMA 'my_namespace';

CREATE OR REPLACE ICEBERG TABLE my_iceberg_table (
  first_name string,
  last_name string,
  amount int,
  create_date date
)
  ICEBERG_VERSION = 3;
Copy

v3 Icebergテーブルへの書き込み

Snowflake管理および:ref:`外部管理<label-tables_iceberg_externally_managed_write_operations>`のIceberg v3テーブルへの書き込みは、DMLコマンドのINSERT、UPDATE、DELETE、MERGE、TRUNCATE TABLE、COPY INTOがサポートされています。

次の例では、|iceberg-tm|テーブル仕様のv3に準拠した|iceberg-tm|テーブルに行を挿入します。

INSERT INTO my_v3_iceberg_table (id, payload) VALUES (1, PARSE_JSON('{"name": "Alice", "age": 30}'));
Copy

次の例では、ファイルを|iceberg-tm|テーブル仕様のv3に準拠した|iceberg-tm|テーブルにロードします。

COPY INTO my_v3_iceberg_table
  FROM @my_json_stage
  FILE_FORMAT = 'my_json_format'
  MATCH_BY_COLUMN_NAME = CASE_SENSITIVE;
Copy

Snowpipeを使用したデータのロード

次の例では、Snowflake管理テーブルと外部管理テーブルの両方について、Iceberg v3テーブルのファイルからデータをロードします。

CREATE PIPE mypipe
  AUTO_INGEST = TRUE
  INTEGRATION = 'MYINT'
  AS
  COPY INTO snowpipe_db.public.my_v3_iceberg_table
  FROM @snowpipe_db.public.mystage
  FILE_FORMAT = (TYPE = 'JSON');
Copy

注釈

Snowflakeは、Iceberg v3の追加書き込み機能をサポートしています。このリストについては、:ref:`Iceberg v3機能の考慮事項と制限<iceberg-v3_considerations_limitations>`を参照してから、サポートされるSnowflake機能リストを参照してください。

v3の動的Icebergテーブルを作成する

次の例では、v3 Snowflake管理のIcebergテーブルを動的テーブルの出力として書き込みます。

CREATE DYNAMIC ICEBERG TABLE my_dynamic_iceberg_v3_table (
    num_orders NUMBER(10,0),
    order_day
  )
  TARGET_LAG = '20 minutes'
  WAREHOUSE = my_warehouse
  EXTERNAL_VOLUME = 'my_external_volume'
  CATALOG = 'SNOWFLAKE'
  BASE_LOCATION = 'my_dynamic_iceberg_v3_table'
  ICEBERG_VERSION = 3
  AS
    SELECT
        COUNT(DISTINCT order_id)
        DATE_TRUNC('DAY', order_timestamp_ns) AS order_day
      FROM staging_v3_iceberg_table;
Copy

注釈

v2またはv3外部管理のIcebergテーブルを動的テーブルのターゲットとして書き込むことはサポートされていません。動的Icebergテーブルの出力は、Snowflake管理でのみ可能です。

v3のIcebergテーブルをクエリする

次の例では、Snowflake管理または外部管理のIceberg v3テーブルをクエリします。

SELECT * FROM MY_DB.MY_SCHEMA.MY_ICEBERG_V3_TABLE;
Copy