動的 Apache Iceberg™ テーブルを作成する

このトピックでは、クエリ結果をIcebergテーブル形式で保存する動的Icebergテーブルの作成方法について説明します。

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

動的Icebergテーブルは、動的テーブルとSnowflakeが管理するIcebergテーブルの利点を組み合わせ、外部クラウドストレージ管理、自動データ変換、パフォーマンス最適化などの機能を提供します。

動的Icebergテーブルはデータレイクと統合され、Snowflakeによって管理されながら、 AWS S3やAzure Blob Storageなどの外部クラウドストレージにデータを保存できます。これらのテーブルは、 ACID トランザクション、スキーマ進化、隠しパーティショニング、テーブルスナップショットをサポートしています。

動的なIcebergテーブルを使った自動データ変換では、宣言型 SQL を使用して、中間ステップを管理することなく、望ましい最終状態を定義します。Snowflakeは、オーケストレーション、スケジューリング、および指定されたデータ鮮度ターゲットに基づくデータ変換のリフレッシュを処理します。

変更されたデータのみを処理するインクリメンタル処理によってパフォーマンスが最適化され、完全なデータ更新に比べてパフォーマンスが向上し、コストが削減されます。さらに、簡単なコマンドでバッチ処理とストリーミングデータを切り替えることができ、データ処理ワークフローに柔軟性をもたらします。

動的Icebergテーブルの使用例には次のようなものがあります。

  • データレイク統合: 大容量のデータセットをコスト効率よく保存しながら、Snowflake内で変換と分析を実行し、Iceberg形式を活用して効率的なクエリと管理を行うことができます。

  • 継続的なデータ変換パイプラインの定義: 動的テーブルを使用することで、手作業による介入なしにデータを常に最新の状態に保ち、インクリメンタル処理で高速データストリームを効率的に処理できます。

動的Icebergテーブルを作成するには、 CREATE DYNAMIC ICEBERG TABLE SQL ステートメントを実行します。たとえば、 my_iceberg_table から読み込む動的 Iceberg テーブルを作成するには、次の構文を使用します。

CREATE DYNAMIC ICEBERG TABLE my_dynamic_iceberg_table (product_id NUMBER(10,0), product_name STRING, order_time TIMESTAMP_NTZ)
  TARGET_LAG = '20 minutes'
  WAREHOUSE = my_warehouse
  EXTERNAL_VOLUME = 'my_external_volume'
  CATALOG = 'SNOWFLAKE'
  BASE_LOCATION = 'my_iceberg_table'
  AS
    SELECT product_id, product_name, order_time FROM staging_table;

パーティション分割、ファイルサイズ、パスレイアウトの構成

動的Icebergテーブルは PARTITION_BYTARGET_FILE_SIZE および PATH_LAYOUT テーブルプロパティをサポートします。これらのプロパティは、通常のSnowflake管理Icebergテーブルと同じように機能します。

  • PARTITION_BY:テーブル内のデータファイルをSnowflakeがパーティション化する方法を制御する1つ以上のIcebergパーティション式を指定します。たとえば、動的Icebergテーブルを order_time 列の年数で分割します。

    CREATE DYNAMIC ICEBERG TABLE my_dynamic_iceberg_table (
        product_id NUMBER(10,0),
        product_name STRING,
        order_time TIMESTAMP_NTZ
      )
      TARGET_LAG = '20 minutes'
      WAREHOUSE = my_warehouse
      EXTERNAL_VOLUME = 'my_external_volume'
      CATALOG = 'SNOWFLAKE'
      BASE_LOCATION = 'my_iceberg_table'
      PARTITION BY (YEAR(order_time))
      PATH_LAYOUT = HIERARCHICAL
      AS
        SELECT product_id, product_name, order_time FROM staging_table;
    

    サポートされているパーティション変換については、 パーティション式パラメーター(partitionExpression) を参照してください。

  • TARGET_FILE_SIZE:テーブルのターゲットParquetファイルサイズを指定します。デフォルトで AUTO となり、これによりSnowflakeはテーブルの特性に基づいてファイルサイズを選択できます。詳細については、 ターゲットファイルサイズの設定 をご参照ください。

  • PATH_LAYOUT:Snowflakeが、フラットまたは階層パスレイアウトを使用してParquetデータファイルを書き込むかどうかを指定します。デフォルトは FLAT です。PARTITION_BY と一緒に HIERARCHICAL を使用して、 data/ ディレクトリ下でHiveスタイルのパーティション化されたパスを有効にします。

完全なパラメーターについて詳しくは CREATE DYNAMIC ICEBERG TABLE を参照してください。

動的Icebergテーブルに関する将来の付与

スキーマ内に作成された新しい動的Icebergテーブルへのアクセスを確保するには、 DYNAMIC キーワードを使用せずに、 GRANT ... ON FUTURE ICEBERG TABLES 構文を使用します。例:

GRANT <privilege> ON FUTURE ICEBERG TABLES IN SCHEMA my_schema TO ROLE my_role;

DYNAMIC キーワードを使用すると、スキーマ内に作成された新しい動的Icebergテーブルへのアクセス権は付与されません。例えば、以下のコマンドは動的Icebergテーブルには適用されません:

GRANT <privilege> ON FUTURE DYNAMIC TABLES IN SCHEMA my_schema TO ROLE my_role;

考慮事項と制約

  • 動的Icebergテーブルは、Snowflakeの通常のIcebergテーブルと同じデータ型をサポートしています。詳細については、 サポートされているデータ型 をご参照ください。

  • カタログ はアカウント、スキーマ、またはデータベースのパラメータで、通常のSnowflakeが管理するIcebergテーブルと同様に、暗黙的に設定することができます。

  • 動的Icebergテーブルは現在、 IF NOT EXISTS 句をサポートしていません。IF NOT EXISTS 句を使用すると、ターゲットテーブルがすでに存在する場合にエラーが発生します。

  • 動的Icebergテーブルは現在、 CREATE ステートメントでのみサポートされています。他のコマンド(例えば、 ALTER DYNAMIC ICEBERG TABLE <名>)で DYNAMIC ICEBERG を指定するとエラーになります。

  • 動的Icebergテーブルをクローンすることはできません。さらに、動的Icebergテーブルを含むデータベースやスキーマをクローンしても、テーブルは新しい場所にクローンされません。