Apache Iceberg™ テーブル:Apache Iceberg™ v3のサポート(プレビュー)¶
このプレビューでは、|iceberg-tm|仕様のv3のサポートが導入されていますが、いくつかの考慮事項と制限があります。特に明記されていない限り、このプレビューでは、Snowflake管理テーブルと外部管理Icebergテーブルの両方がサポートされています。
サポートされるIceberg v3の機能¶
このセクションでは、このプレビューでサポートされるIceberg v3の機能をリストします。
データ型¶
次のv3データ型が、パブリックプレビューでサポートされています。
geographygeometrynanosecondvariant
詳細については、 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;
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;
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;
注釈
既存のテーブルの形式バージョンを変更するためにALTER ICEBERG TABLEコマンドを使用することはできません。
Icebergテーブルの形式バージョンを取得する¶
次の例は、特定のテーブルのIcebergバージョンを取得する方法を示しています。
SHOW PARAMETERS LIKE 'ICEBERG_VERSION' IN TABLE my_v3_iceberg_table;
出力:
+-----------------+-------+---------+-------+---------------------------------------------------+--------+ | 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');
出力:
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テーブルの追加専用ストリーム
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');
注釈
サポートされない機能のリストは確定されておらず、将来変更される可能性があります。リストは、必要に応じて更新され、サポートされていない機能の最新状況が反映されます。
v3機能に固有の考慮事項と制限については、機能の:ref:`機能トピック<label-apache_iceberg_specification_supported_v3_features>`を参照してください。
サポートされているSnowflake機能¶
:ref:`サポートされていないSnowflake機能<label-tables_iceberg_v3_unsupported_features>`セクションに記載されていない機能は、サポートされています。サポートされている機能には、以下のリストのものが含まれています。
機能 |
メモ |
|---|---|
クラスタリング |
Snowflake管理Iceberg v3のみ。 |
次の考慮事項でサポートされています。
|
|
LOAD_MODE = FULL_INGESTまたはADD_FILES COPYは以下の点を考慮してサポートされています。
|
|
次の制限でサポートされています。
|
|
データ保護ポリシー |
次のデータ保護ポリシーがサポートされています。
|
データ品質モニタリング |
|
v3外部管理Icebergテーブルを動的テーブルのターゲットとして書き込みます。 |
|
クエリアクセラレーション |
|
機密データの分類 |
|
パーティション化されたテーブルは削除ベクターも書き込めません。パーティション化されたテーブルでは書き込み時コピーのみがサポートされています。 |
|
バージョン4.0以降。 |
|
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はサポートされていません。 |
追加または上書きメソッドを使用した、既存のIceberg v3テーブルへのデータフレームの書き込みがサポートされています。新しい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;
次の例では、リモートの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;
次の例では、列定義を持ち、|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;
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}'));
次の例では、ファイルを|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;
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');
注釈
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;
注釈
v2またはv3外部管理のIcebergテーブルを動的テーブルのターゲットとして書き込むことはサポートされていません。動的Icebergテーブルの出力は、Snowflake管理でのみ可能です。
v3のIcebergテーブルをクエリする¶
次の例では、Snowflake管理または外部管理のIceberg v3テーブルをクエリします。
SELECT * FROM MY_DB.MY_SCHEMA.MY_ICEBERG_V3_TABLE;