動的Icebergテーブルを使って、Snowflake内にデータを保存せずデータパイプラインを作成出来るか試してみた

# はじめに
2024年11月中旬のSnowflakeの[リリース](https://docs.snowflake.com/en/release-notes/2024/other/2024-11-12-dynamic-iceberg-tables)で[動的Icebergテーブル](https://docs.snowflake.com/en/user-guide/dynamic-tables-create-iceberg)がGAされました！
この機能があれば、Snowflake上にデータを保管せず、S3(クラウドストレージサービス)のみに生データや加工データをIceberg形式で配置して、Snowflakeを使うことができるかもしれないと感じています。
今回は、**外部テーブルと動的Icebergテーブルを使って、Snowflakeにデータを保存せずどこまでデータパイプラインを作成出来るか**について試してみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342101/c2c3a90a-2fb4-21a5-aef1-25dfd26f7e00.png)

:::note warn
本検証は2024/12/1時点のものです。最新の状況についてはSnowflakeドキュメントを確認してください。
:::

# 動的Icebergテーブルとは？
2024年度の初めに[動的テーブル](https://docs.snowflake.com/en/user-guide/dynamic-tables-about)がGAしたことにより、Snowflakeで宣言型のデータパイプラインの構築が出来るようになりました。(個人的に宣言型で処理を定義できると、その処理で何をやりたいかが分かりやすくなるので好きなんですよね。)
今回の[リリース](https://docs.snowflake.com/en/release-notes/2024/other/2024-11-12-dynamic-iceberg-tables)により、動的テーブルの保存結果をIceberg形式でクラウドストレージサービス上に保存できるようになっています。
動的Icebergテーブルは以下のシナリオでの利用が想定されているようです。
※リリースノートの機械翻訳
> - **データ レイクの統合**: Iceberg 形式を活用して効率的なクエリと管理を行うことで、Snowflake 内で変換と分析を実行し、大規模なデータセットをコスト効率よく保存できます。
> - **継続的なデータ変換パイプラインの定義**: 動的テーブルを使用すると、手動による介入なしにデータが常に最新の状態に保たれ、増分処理によって高速データ ストリームを効率的に処理できます。

# 検証手順
コードはモックとしてかなり簡単な書き方で書いています。

## 1. 環境準備
データベース、スキーマ、ストレージ統合、外部ステージ、外部ボリューム、ファイル形式を作成します。
```SQL
--データベースの作成
CREATE OR REPLACE DATABASE DB;
--スキーマの作成
CREATE OR REPLACE SCHEMA DB.DATALAKE;
CREATE OR REPLACE SCHEMA DB.DWH;
CREATE OR REPLACE SCHEMA DB.DATAMART;
--ストレージ統合の作成
CREATE OR REPLACE STORAGE INTEGRATION INTS3
  TYPE = EXTERNAL_STAGE
  STORAGE_PROVIDER = 'S3'
  ENABLED = TRUE
  STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::*****:role/mysnowflakerole'
  STORAGE_ALLOWED_LOCATIONS = ('s3://*****/iceberg/');
--外部ステージの作成
CREATE OR REPLACE STAGE DB.DATALAKE.stages3
    STORAGE_INTEGRATION = INTS3
  URL = 's3://*****/iceberg/';
--外部ボリュームの作成
CREATE OR REPLACE EXTERNAL VOLUME exvol
STORAGE_LOCATIONS =
(
  (
    NAME = '*****'
    STORAGE_PROVIDER = 'S3'
    STORAGE_BASE_URL = 's3://*****/iceberg/'
    STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::*****:role/mysnowflakerole'
    ENCRYPTION=(TYPE='AWS_SSE_S3')
  )
);
--ファイル形式の作成
CREATE OR REPLACE FILE FORMAT DB.DATALAKE.FF_JSON
  type = json
  STRIP_OUTER_ARRAY = TRUE;
```
## 2. S3にJSONファイルを配置
事前に、S3にJSONデータを配置します。パスは「iceberg/BakerySalesData_20241201.json」としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342101/2f4ef950-2b57-652b-ab01-7a6048cdb2b0.png)

使用するデータはこちら。架空のケーキ屋の売上データです(ChatGPTで生成)。
```JSON
{
  "storeName": "Sweet Delights",
  "salesDate": "2024-12-01",
  "transactions": [
    {
      "transactionId": "T001",
      "productName": "Chocolate Chip Cookie",
      "category": "Cookies",
      "quantitySold": 25,
      "unitPrice": 1.5,
      "totalPrice": 37.5,
      "customerType": "Regular",
      "paymentMethod": "Credit Card",
      "purchaseTime": "10:15 AM",
      "employeeId": "E101"
    },
    {
      "transactionId": "T002",
      "productName": "Strawberry Cupcake",
      "category": "Cupcakes",
      "quantitySold": 10,
      "unitPrice": 2.0,
      "totalPrice": 20.0,
      "customerType": "New",
      "paymentMethod": "Cash",
      "purchaseTime": "11:30 AM",
      "employeeId": "E102"
    },
    {
      "transactionId": "T003",
      "productName": "Macaron Box (12 pcs)",
      "category": "Macarons",
      "quantitySold": 5,
      "unitPrice": 15.0,
      "totalPrice": 75.0,
      "customerType": "Regular",
      "paymentMethod": "Mobile Payment",
      "purchaseTime": "1:45 PM",
      "employeeId": "E103"
    },
    {
      "transactionId": "T004",
      "productName": "Vanilla Cheesecake Slice",
      "category": "Cakes",
      "quantitySold": 8,
      "unitPrice": 3.5,
      "totalPrice": 28.0,
      "customerType": "Regular",
      "paymentMethod": "Credit Card",
      "purchaseTime": "3:00 PM",
      "employeeId": "E101"
    },
    {
      "transactionId": "T005",
      "productName": "Salted Caramel Brownie",
      "category": "Brownies",
      "quantitySold": 15,
      "unitPrice": 2.5,
      "totalPrice": 37.5,
      "customerType": "New",
      "paymentMethod": "Cash",
      "purchaseTime": "5:15 PM",
      "employeeId": "E104"
    }
  ]
}
```

## 3. 外部テーブルを作成
Snowflakeから読み込むために、先ほどのJSONファイルをソースとする外部テーブルを作成します。
```SQL
CREATE OR REPLACE EXTERNAL TABLE DB.DATALAKE.XT_BAKERYSALESDATA
  LOCATION = @STAGES3 
  PATTERN = '.*BakerySalesData_.*'
  AUTO_REFRESH = TRUE
  FILE_FORMAT=(FORMAT_NAME=FF_JSON);
```
これにより、Snowflakeからファイルを参照できるようになりました。
```SQL
SELECT * FROM DB.DATALAKE.XT_BAKERYSALESDATA;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342101/c2ff80b7-d34a-bd34-1ae9-37780765e322.png)

## 4. DWHテーブルを作成
動的Icebergテーブルを使って、外部テーブルからIcebergテーブルを作ります。

```SQL
CREATE OR REPLACE DYNAMIC ICEBERG TABLE DB.DWH.DIT_BakerySalesData
  TARGET_LAG = '20 minutes'
  WAREHOUSE = COMPUTE_WH
  EXTERNAL_VOLUME = 'exvol'
  CATALOG = 'SNOWFLAKE'
  BASE_LOCATION = 'DWH/BakerySalesData'
  AS
SELECT
  t1.VALUE:storeName::STRING AS storeName,
  t1.VALUE:salesDate::STRING AS salesDate,
  t2.VALUE:transactionId::STRING AS transactionId,
  t2.VALUE:productName::STRING AS productName,
  t2.VALUE:category::STRING AS category,
  t2.VALUE:unitPrice::STRING AS unitPrice,
  t2.VALUE:totalPrice::STRING AS totalPrice,
  t2.VALUE:customerType::STRING AS customerType,
  t2.VALUE:paymentMethod::STRING AS paymentMethod,
  t2.VALUE:purchaseTime::STRING AS purchaseTime,
  t2.VALUE:employeeId::STRING AS employeeId
FROM DB.DATALAKE.STG_BAKERYSALESDATA t1 , LATERAL FLATTEN(INPUT => t1.VALUE:transactions) t2;
```

上記のSQLを実行してみると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342101/2a33020c-17f3-dce9-3fe8-69ecca0d08ca.png)
エラーが発生しました。
現時点では**外部テーブルをソースとする動的(Iceberg)テーブルは作成できない**とのこと。
[ドキュメント](https://docs.snowflake.com/en/user-guide/dynamic-tables-limitations#limitations-on-query-constructs)にもしっかり書いてありますね・・・。

元々の想定とは異なる検証結果になりましたが、
外部テーブルをSnowflakeテーブル化して、後続の検証を進めます。
```SQL
CREATE TABLE DB.DATALAKE.STG_BAKERYSALESDATA
AS SELECT * FROM XT_BAKERYSALESDATA;
```
以下で、Snowflakeテーブルをソースとする動的Icebergテーブルを作成すると・・・
```SQL
CREATE OR REPLACE DYNAMIC ICEBERG TABLE DB.DWH.DIT_BAKERYSALESDATA
  TARGET_LAG = '20 minutes'
  WAREHOUSE = COMPUTE_WH
  EXTERNAL_VOLUME = 'exvol'
  CATALOG = 'SNOWFLAKE'
  BASE_LOCATION = 'DWH/BakerySalesData'
  AS
SELECT
  t1.VALUE:storeName::STRING AS storeName,
  t1.VALUE:salesDate::STRING AS salesDate,
  t2.VALUE:transactionId::STRING AS transactionId,
  t2.VALUE:productName::STRING AS productName,
  t2.VALUE:category::STRING AS category,
  t2.VALUE:unitPrice::STRING AS unitPrice,
  t2.VALUE:totalPrice::STRING AS totalPrice,
  t2.VALUE:customerType::STRING AS customerType,
  t2.VALUE:paymentMethod::STRING AS paymentMethod,
  t2.VALUE:purchaseTime::STRING AS purchaseTime,
  t2.VALUE:employeeId::STRING AS employeeId
FROM DB.DATALAKE.STG_BAKERYSALESDATA t1 , LATERAL FLATTEN(INPUT => t1.VALUE:transactions) t2;
```
無事、動的Icebergテーブルを作成できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342101/d345ac8c-6fe7-cad0-29ce-d7f459a9c589.png)
S3を見てみると、Icebergテーブルが作られていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342101/e35eaf9a-07e7-9635-3857-467264ac46dc.png)

## 5. DMテーブルの作成
動的Icebergテーブルを使って、先程作成したIcebergテーブルからIcebergテーブルを作ります。
```SQL
CREATE OR REPLACE DYNAMIC ICEBERG TABLE DB.DATAMART.DIT_BakerySalesSum
  TARGET_LAG = '20 minutes'
  WAREHOUSE = COMPUTE_WH
  EXTERNAL_VOLUME = 'exvol'
  CATALOG = 'SNOWFLAKE'
  BASE_LOCATION = 'DM/BakerySalesSum'
  AS
SELECT
  STORENAME,
  SALESDATE,
  SUM(TOTALPRICE) AS COST
FROM DB.DWH.DIT_BAKERYSALESDATA GROUP BY ALL;
```
こちらも、無事、動的Icebergテーブルを作成できました。
S3を見てみると、Icebergテーブルが作られていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342101/f993f3fa-098b-76f5-8ef1-17ffd9293edf.png)
もちろんSnowflakeからも普通に参照できます。
```SQL
SELECT * FROM DB.DATAMART.DIT_BakerySalesSum;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342101/712ef077-2a98-ca0f-46e1-def49a6d8330.png)

# まとめ
記事作成(2024/12/1)時点では、**外部テーブルのデータソースとした動的テーブルを作成できない**ため、外部テーブルと動的Icebergテーブルを使った方法では、Snowflakeにデータを保存せずデータパイプラインを作成することができませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342101/da067408-69fd-5808-acef-6b34621afb00.png)

ただ、同時期の[リリース](https://docs.snowflake.com/en/release-notes/2024/other/2024-11-15-iceberg-tables-loading)で、Icebergテーブルに対するバルクロードもGAされていますので、こちらを使えば、**Snowflakeにデータを保存せずデータパイプラインを作成することは可能**です。(この記事では割愛しています。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342101/a61e33a0-f299-5752-69c3-9de875969606.png)

これまでは「データはSnowflake内に保存する」前提でしたが、今後は「データは全て自社のクラウドストレージサービスに保存する」という使い方が容易に実現できるようになってきていると感じました。

# 仲間募集

NTTデータ テクノロジーコンサルティング事業本部 では、以下の職種を募集しています。

<details><summary>1. クラウド技術を活用したデータ分析プラットフォームの開発・構築(ITアーキテクト/クラウドエンジニア)</summary>

クラウド／プラットフォーム技術の知見に基づき、DWH、BI、ETL領域におけるソリューション開発を推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/cloud_engineer

</details>

<details><summary>2. データサイエンス領域（データサイエンティスト／データアナリスト）</summary>

データ活用／情報処理／AI／BI／統計学などの情報科学を活用し、よりデータサイエンスの観点から、データ分析プロジェクトのリーダーとしてお客様のDX／デジタルサクセスを推進します。
https://enterprise-aiiot.nttdata.com/recruitment/career_sp/datascientist

</details>

<details><summary>3.お客様のAI活用の成功を推進するAIサクセスマネージャー</summary>

DataRobotをはじめとしたAIソリューションやサービスを使って、
お客様のAIプロジェクトを成功させ、ビジネス価値を創出するための活動を実施し、
お客様内でのAI活用を拡大、NTTデータが提供するAIソリューションの利用継続を推進していただく人材を募集しています。
https://nttdata.jposting.net/u/job.phtml?job_code=804

</details>

<details><summary>4.DX／デジタルサクセスを推進するデータサイエンティスト《管理職/管理職候補》</summary>
データ分析プロジェクトのリーダとして、正確な課題の把握、適切な評価指標の設定、分析計画策定や適切な分析手法や技術の評価・選定といったデータ活用の具現化、高度化を行い分析結果の見える化・お客様の納得感醸成を行うことで、ビジネス成果・価値を出すアクションへとつなげることができるデータサイエンティスト人材を募集しています。

https://nttdata.jposting.net/u/job.phtml?job_code=898

</details>


## ソリューション紹介

<details><summary> Trusted Data Foundationについて</summary><div>

～データ資産を分析活用するための環境をオールインワンで提供するソリューション～
https://www.nttdata.com/jp/ja/lineup/tdf/
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ（Datalake+DWH+AI/BI）を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。

</div></details>

<details><summary> TDFⓇ-AM（Trusted Data Foundation - Analytics Managed Service）について</summary><div>

～データ活用基盤の段階的な拡張支援（Quick Start) と保守運用のマネジメント（Analytics Managed）をご提供することでお客様のDXを成功に導く、データ活用プラットフォームサービス～
https://www.nttdata.com/jp/ja/lineup/tdf_am/
TDFⓇ-AMは、データ活用をQuickに始めることができ、データ活用の成熟度に応じて段階的に環境を拡張します。プラットフォームの保守運用はNTTデータが一括で実施し、お客様は成果創出に専念することが可能です。また、日々最新のテクノロジーをキャッチアップし、常に活用しやすい環境を提供します。なお、ご要望に応じて上流のコンサルティングフェーズからAI/BIなどのデータ活用支援に至るまで、End to Endで課題解決に向けて伴走することも可能です。

</div></details>


<details><summary> NTTデータとDatabricksについて </summary>
NTTデータは、お客様企業のデジタル変革・DXの成功に向けて、「databricks」のソリューションの提供に加え、情報活用戦略の立案から、AI技術の活用も含めたアナリティクス、分析基盤構築・運用、分析業務のアウトソースまで、ワンストップの支援を提供いたします。

https://www.nttdata.com/jp/ja/lineup/databricks/

</details>


<details><summary>NTTデータとTableauについて </summary><div>

ビジュアル分析プラットフォームのTableauと2014年にパートナー契約を締結し、自社の経営ダッシュボード基盤への採用や独自のコンピテンシーセンターの設置などの取り組みを進めてきました。さらに2019年度にはSalesforceとワンストップでのサービスを提供開始するなど、積極的にビジネスを展開しています。

これまでPartner of the Year, Japanを4年連続で受賞しており、2021年にはアジア太平洋地域で最もビジネスに貢献したパートナーとして表彰されました。
また、2020年度からは、Tableauを活用したデータ活用促進のコンサルティングや導入サービスの他、AI活用やデータマネジメント整備など、お客さまの企業全体のデータ活用民主化を成功させるためのノウハウ・方法論を体系化した「デジタルサクセス」プログラムを提供開始しています。
https://www.nttdata.com/jp/ja/lineup/tableau/

</div></details>


<details><summary>NTTデータとAlteryxについて </summary><div>
Alteryxは、業務ユーザーからIT部門まで誰でも使えるセルフサービス分析プラットフォームです。

Alteryx導入の豊富な実績を持つNTTデータは、最高位にあたるAlteryx Premiumパートナーとしてお客さまをご支援します。

導入時のプロフェッショナル支援など独自メニューを整備し、特定の業種によらない多くのお客さまに、Alteryxを活用したサービスの強化・拡充を提供します。

https://www.nttdata.com/jp/ja/lineup/alteryx/

</div></details>

<details><summary>NTTデータとDataRobotについて </summary><div>
DataRobotは、包括的なAIライフサイクルプラットフォームです。

NTTデータはDataRobot社と戦略的資本業務提携を行い、経験豊富なデータサイエンティストがAI・データ活用を起点にお客様のビジネスにおける価値創出をご支援します。

https://www.nttdata.com/jp/ja/lineup/datarobot/

</div></details>

<details><summary> NTTデータとInformaticaについて</summary><div>

データ連携や処理方式を専門領域として10年以上取り組んできたプロ集団であるNTTデータは、データマネジメント領域でグローバルでの高い評価を得ているInformatica社とパートナーシップを結び、サービス強化を推進しています。
https://www.nttdata.com/jp/ja/lineup/informatica/

</div></details>

<details><summary>NTTデータとSnowflakeについて </summary><div>
NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。

NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。
Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。

https://www.nttdata.com/jp/ja/lineup/snowflake/

</div></details>