新米エンジニアがSnowflake Notebooksのスケジューリング実行を試してみた
0. はじめに
Snowflakeでは、SQLを中心としたデータ加工に加え、Pythonを用いた分析や検証処理をSnowflake上で完結させるための機能が拡充されており、その一つとして、Jupyter Notebookのような操作感でインタラクティブに処理を記述・実行できるNotebook機能が提供されています。
Notebookを利用することで、SQLやPythonを組み合わせた処理を段階的に実装し、その場で結果を確認しながら分析やデータ加工の試行錯誤を進めることができます。
こうした中で、Notebook上で作成した処理を日次や週次で定期的に実行したいと考える場面も出てくると思います。
Snowflakeでは、Notebookに記載した処理をそのまま活かしつつ、Taskやストアドプロシージャを実装することなく、GUI操作のみでスケジューリング実行を設定できる仕組みが用意されています。
本記事では、Snowflake Notebooksのスケジューリング実行機能に焦点を当て、その仕組みと利用方法についてご紹介します。
1. Snowflake Notebooksについて
1.1 Snowflake Notebooksの概要
Snowflake Notebooksは、Snowsight上で利用できるセルベースの対話的な開発環境です。
PythonやSQL、Markdownを用いたプログラミングが可能で、データ分析や機械学習モデルの開発、データエンジニアリングのワークフローを、すべて同一のインターフェイス上で実行できます。
また、Snowflake NotebooksはGitとの連携にも対応しており、Notebookのコードをリポジトリで管理することも可能です。これにより、分析用コードのバージョン管理やチーム開発も効率的に行うことができます。
1.2 Snowflake Notebooksのランタイムについて
Snowflake Notebooksでは、用途に応じてウェアハウスランタイムとコンテナランタイムの2種類の実行環境を選択できます。
ウェアハウスランタイム
仕組み
ウェアハウスランタイムでは、NotebookのエンジンやPythonプロセスがNotebookウェアハウス上で実行されます。SQLやSnowparkのプッシュダウンクエリは、クエリウェアハウスに送られて処理されます。

画像引用:Snowflake DOCUMENTATION「Snowflake Notebboksを設定する」https://docs.snowflake.com/ja/user-guide/ui-snowsight/notebooks-setup
メリット
- 既存のウェアハウスをそのまま活用でき、構成がシンプル。
- Snowflake Anacondaチャンネルを通じて、多数のPythonパッケージをすぐに利用可能。
デメリット
- GPUを利用するような本格的な機械学習ワークロードには向いていない。
ユースケース
- SQLやSnowparkを中心としたデータ分析や検証。
- 比較的軽量なデータ加工やETL処理。
コンテナランタイム
仕組み
コンテナランタイムでは、NotebookのPythonカーネルやコード実行がSnowpark Container ServicesのCompute Pool上で実行されます。
SQLセルやSnowparkプッシュダウンクエリは、ウェアハウスランタイムと同様にクエリウェアハウスで処理されます。

画像引用:Snowflake DOCUMENTATION「Notebooks on Container Runtime for ML」https://docs.snowflake.com/ja/developer-guide/snowflake-ml/notebooks-on-spcs
メリット
- ML向けにプリインストールされたパッケージ群をそのまま利用可能。
- pipを使って任意のカスタムパッケージを追加できる。
- GPUを利用した計算が可能で、モデルの学習や推論にも対応できる。
デメリット
- 事前にCompute Poolの作成・管理が必要となるため、ウェアハウスランタイムと比べると設定項目が多く、Snowflakeに不慣れな場合は利用ハードルが高くなる。
ユースケース
- Python中心で柔軟なライブラリ構成が求められる分析。
- GPUを利用したAI/MLワークロード。
1.3 Snowflake Notebooksのスケジューリング実行
Snowflake Notebooksの機能の一つとして、本記事のテーマでもある スケジューリング実行機能が提供されています。
スケジューリング実行機能は、ETL処理や分析処理、機械学習タスクなどを定期的に実行するための仕組みです。
Snowflake Notebooksでは、このスケジューリング設定を GUI上からシンプルに行うことができ、Taskやストアドプロシージャを直接実装する必要はありません。
そのため、Snowflakeやデータ基盤の内部構造に詳しくない分析者でも扱いやすい点が特徴です。
以降では、このスケジューリング実行機能を実際に利用しながら、その仕組みや挙動について確認していきます。
2. Snowflake Notebooksのスケジューリング機能を試してみる
ここからは、Snowflake Notebooks のスケジューリング実行を実際に試していきます。
本デモでは、SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.WEB_SALES を題材に、顧客ごとの購買状況を集計する処理をNotebook上で作成し、そのNotebookをスケジューリング実行する流れを確認します。
2.1 Notebookの作成(事前準備)
まずはSnowsightから新規のNotebookを作成します。

作成時の設定画面では、ランタイムや利用するウェアハウスなどの設定を行います。これらの項目は、以下の画面からまとめて指定できます。

セルを追加する際は、セル下部からPython、SQL、Markdownのいずれかを選択することで、新しいセルを作成できます。

また、セルを作成した後でも、セル左上のメニューから実行形式を変更することが可能です。

2.2 分析処理作成
それではここから、実際にNotebook上でデータ変換処理ロジックを記載していきます。
2.2.1 分析用の元データを準備する
まずは、今回の検証で利用する元データを用意します。
Snowflakeが提供している標準サンプルデータのWEB_SALESテーブルから、顧客IDや商品IDなどの必要最低限のカラムのみを抽出し、一時テーブルとして保存します。
以降の処理では、この一時テーブルを基に集計を行っていきます。
SQL:WEB_SALESから分析用データを抽出
CREATE OR REPLACE TEMP TABLE ws_base AS
SELECT
ws_bill_customer_sk AS customer_id,
ws_item_sk AS item_id,
ws_quantity AS quantity,
ws_sales_price AS sales_price
FROM SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.WEB_SALES
WHERE ws_bill_customer_sk IS NOT NULL
LIMIT 10000;
2.2.2 顧客ごとの購買状況を集計する
2.2.1で作成したベースデータをpandas DataFrameとして読み込み、Pythonで顧客ごとの購買状況を集計します。
購入回数や購入金額などの指標を算出し、結果をSnowflakeのテーブルとして保存します。
Python:顧客ごとの購買状況を集計
import pandas as pd
import snowflake.snowpark as snp
# Snowparkセッションを取得
session = snp.Session.builder.getOrCreate()
# WS_BASEをpandas DataFrameとして取得
df = session.table("WS_BASE").to_pandas()
# 数値計算に使う列を数値型に統一
df["QUANTITY"] = pd.to_numeric(df["QUANTITY"], errors="coerce").fillna(0)
df["SALES_PRICE"] = pd.to_numeric(df["SALES_PRICE"], errors="coerce").fillna(0)
results = []
# 顧客ごとに購買データを集計
for customer_id, sub in df.groupby("CUSTOMER_ID"):
# 購入回数(レコード数)
purchase_count = len(sub)
# 総購入金額(数量 × 単価の合計)
total_sales_amount = (sub["QUANTITY"] * sub["SALES_PRICE"]).sum()
# 平均注文金額(1回あたりの購入金額)
avg_order_value = (
total_sales_amount / purchase_count if purchase_count > 0 else 0
)
# 購入した商品の種類数(ユニーク商品数)
unique_item_count = sub["ITEM_ID"].nunique()
# 購入回数に基づく顧客ラベル付け
# - one_time : 1回のみ購入
# - light : 少数回の購入
# - regular : 定期的に購入
# - heavy : 購入回数が多い
if purchase_count == 1:
purchase_segment = "one_time"
elif purchase_count <= 5:
purchase_segment = "light"
elif purchase_count <= 20:
purchase_segment = "regular"
else:
purchase_segment = "heavy"
# 顧客ごとの集計結果をリストに格納
results.append({
"CUSTOMER_ID": customer_id,
"PURCHASE_COUNT": purchase_count,
"TOTAL_SALES_AMOUNT": float(total_sales_amount),
"AVG_ORDER_VALUE": float(avg_order_value),
"UNIQUE_ITEM_COUNT": unique_item_count,
"PURCHASE_SEGMENT": purchase_segment
})
# pandas DataFrame に変換
result_df = pd.DataFrame(results)
# 集計結果を Snowflake に保存
session.write_pandas(
result_df,
table_name="CUSTOMER_PURCHASE_METRICS",
auto_create_table=True,
overwrite=True
)
2.3 Notebookにスケジュールを設定する
Snowflake Notebooksでは、Notebookの画面上から簡単にスケジューリングを設定できます。
画面右上の赤枠で囲っている箇所にあるSchedule a notebook runをクリックし、表示されるメニューから Create Scheduleを選択します。

すると、以下の画面に遷移します。

画面が表示されたら、次にスケジュールの内容を設定していきます。
Schedule name
スケジュールの名前を入力します。
ここで指定した名前は、内部的にはSnowflakeのTask名として利用されます。
Frequency
Notebookをどの頻度で実行するかを指定します。
ドロップダウンからHourlyを選択し、at 01 minを指定することで、「毎時1分に実行」というスケジュールになります。
時間帯は(UTC+09:00) (Local time) Tokyoを選択し、日本時間でスケジュールが動くように設定します。
画面の下部に表示されるNext runを見ることで、次回の実行時刻を事前に確認できます。
Parameter(optional)
スケジュール実行時にNotebookに渡すパラメータを指定できます。
本デモでは例として、購入回数による顧客区分の閾値をパラメータとして受け取るようにしています。
スケジュール設定画面では、以下のように指定します。
PARAM_LIGHT=3 PARAM_REGULAR=10
スケジュールから渡されたパラメータは、Notebook実行時にコマンドライン引数として渡され、sys.argvを通して取得できます。
パラメータの値を受け取るには、元のコードのPythonセルに対して一部修正が必要です。
パラメータ対応前のコード
元々のコードでは、購入回数に基づいて付与するラベルを、コード内に固定値として定義していました。
if purchase_count == 1:
purchase_segment = "one_time"
elif purchase_count <= 5:
purchase_segment = "light"
elif purchase_count <= 20:
purchase_segment = "regular"
else:
purchase_segment = "heavy"
パラメータ対応後のコード
スケジュールから渡されたパラメータを使えるように、以下の処理を追加します。
import sys
# スケジュール実行時に渡されたパラメータを取得
params = {}
for arg in sys.argv:
if "=" in arg:
key, value = arg.split("=", 1)
params[key] = value
# 購入回数セグメントの閾値(未指定時はデフォルト値を使用)
param_light = int(params.get("PARAM_LIGHT", "5"))
param_regular = int(params.get("PARAM_REGULAR", "20"))
print(f"PARAM_LIGHT = {param_light}, PARAM_REGULAR = {param_regular}")
# 購入回数に基づく顧客ラベル付け(パラメータで閾値を調整可能)
if purchase_count == 1:
purchase_segment = "one_time"
elif purchase_count <= param_light:
purchase_segment = "light"
elif purchase_count <= param_regular:
purchase_segment = "regular"
else:
purchase_segment = "heavy"
Python:顧客ごとの購買状況を集計(パラメータ対応版)
import sys
import pandas as pd
import snowflake.snowpark as snp
# スケジュール実行時に渡されたパラメータを取得
params = {}
for arg in sys.argv:
if "=" in arg:
key, value = arg.split("=", 1)
params[key] = value
# 購入回数セグメントの閾値(未指定時はデフォルト値を使用)
param_light = int(params.get("PARAM_LIGHT", "5"))
param_regular = int(params.get("PARAM_REGULAR", "20"))
print(f"PARAM_LIGHT = {param_light}, PARAM_REGULAR = {param_regular}")
# Snowparkセッションを取得
session = snp.Session.builder.getOrCreate()
# WS_BASEをpandas DataFrameに変換
df = session.table("WS_BASE").to_pandas()
# 数値計算に使う列を数値型に統一
df["QUANTITY"] = pd.to_numeric(df["QUANTITY"], errors="coerce").fillna(0)
df["SALES_PRICE"] = pd.to_numeric(df["SALES_PRICE"], errors="coerce").fillna(0)
results = []
# 顧客ごとに購買データを集計
for customer_id, sub in df.groupby("CUSTOMER_ID"):
# 購入回数(レコード数)
purchase_count = len(sub)
# 総購入金額(数量 × 単価の合計)
total_sales_amount = (sub["QUANTITY"] * sub["SALES_PRICE"]).sum()
# 平均注文金額(1回あたりの購入金額)
avg_order_value = (
total_sales_amount / purchase_count if purchase_count > 0 else 0
)
# 購入した商品の種類数
unique_item_count = sub["ITEM_ID"].nunique()
# 購入回数に基づく顧客ラベル付け(パラメータで閾値を調整可能)
if purchase_count == 1:
purchase_segment = "one_time"
elif purchase_count <= param_light:
purchase_segment = "light"
elif purchase_count <= param_regular:
purchase_segment = "regular"
else:
purchase_segment = "heavy"
results.append({
"CUSTOMER_ID": customer_id,
"PURCHASE_COUNT": purchase_count,
"TOTAL_SALES_AMOUNT": float(total_sales_amount),
"AVG_ORDER_VALUE": float(avg_order_value),
"UNIQUE_ITEM_COUNT": unique_item_count,
"PURCHASE_SEGMENT": purchase_segment
})
# 集計結果を pandas DataFrame に変換
result_df = pd.DataFrame(results)
# 集計結果を Snowflake のテーブルとして保存
session.write_pandas(
result_df,
table_name="CUSTOMER_PURCHASE_METRICS",
auto_create_table=True,
overwrite=True
)
今回のようにパラメータを設定することで、購入回数によるラベル付けの閾値を、Notebookのコード内に固定で書くのではなく、スケジュール実行時に指定できるようになりました。
パラメータは任意項目のため、不要な場合は空欄のままでも問題ありません。
スケジュールの作成
全ての設定が完了したら、右下のCreateをクリックします。
これで、指定したスケジュールに従ってNotebookが自動的に実行されるようになります。
2.4 作成したスケジューリングの確認と実行結果の確認
先ほど作成したスケジュールが正しく設定されているかの確認方法と、Notebookが実際に実行された結果をどこで確認できるのかを見ていきます。
スケジューリングの確認方法

Notebook画面右上の赤枠部分をクリックし、表示されるメニューからView schedulesを選択すると、作成済みのスケジュールを確認できます。

今回は検証用に作成したdemo1というスケジュールが表示されています。こちらをクリックして、詳細を確認してみます。

この画面では、スケジュールの状態(Started/Suspended)、実行頻度、使用しているウェアハウスなどを確認できます。さらに下にスクロールすると、Task definitionが表示されます。ここを見ると分かる通り、Notebookのスケジューリングを作成すると、内部的にはSnowflake Taskが自動生成されていることがわかります。
このように、Notebookのスケジューリング機能は
「GUIで設定→Snowflake Taskを裏側で自動生成→Taskが定期的にNotebookを実行」
という仕組みで動いています。
スケジューリングの実行結果の確認

Notebook画面上の赤枠をクリックし、View run historyをクリックすると、スケジューリング実行の履歴一覧が表示されます。

その中から一つを適当に選ぶと、そのスケジューリング実行時のNotebookの実行結果を確認できます。

この画面では、
- Notebookがどの時刻に実行されたか
- 成功したか/失敗したか
- 各セルごとのSQLやPython の実行内容と結果
をまとめて確認できます。
画面右側に表示されているcell1、cell2は、Notebook内の各セルを表しており、スケジューリング実行時もNotebookを上から下へセル単位で順番に実行していることが分かります。
このようにスケジューリングが実行されたNotebookも、通常のNotebook実行と同じ単位で結果を追えるため、「どこまで処理が進んだのか」「どのセルで失敗したのか」を簡単に把握することが可能です。
3. 実際に使ってみた感想
実際にNotebookに対してスケジューリングを設定してみましたが、GUI上で数箇所設定するだけでTaskが作成でき、とても手軽だという印象を受けました。
私自身、Snowflakeにまだ詳しいわけではありませんが、この操作感であればSQLやデータ基盤の知識がそこまで深くない方でも、スケジューリング設定を簡単に行えると思いました。
また、本筋からは少し逸れますが、Notebook上でSQLによる前処理からPythonによるデータ加工処理までを切り替えることなく一連の処理として記述できる点も印象的でした。都度、SQLやPythonでシートを切り替える必要がなく、1つのNotebookの中で完結できるのは非常に便利だと感じます。
3.1 ワークシートで作るTaskとの違い
ワークシート上でSQLを書いてTaskを作成する場合と比べると、Notebookのスケジューリングは設定や実行の考え方が大きく異なります。
ワークシートでTaskを定義する場合は、
- 複数のTaskを順番や条件付きで繋げる
- ある処理が終わってから次の処理を動かす
- データの更新をきっかけに処理を起動する
といった、処理同士の関係性を細かく制御することができます。その分、Taskの構文や設計を理解する必要があり、最初はややハードルが高く感じられます。
一方で、Notebookのスケジューリングは、こうしたTaskの仕組みを細かく把握していなくても、Notebook上の一連の処理をまとめて定期実行できる点が特徴です。
処理同士の細かな制御を行うというよりも、「まずはこのNotebookの処理を定期的に実行したい」といった用途で使いやすい形になっていると感じました。
3.2 Notebookスケジューリングの立ち位置
以上を踏まえ、Notebookのスケジューリングは、
- Notebook上で分析・前処理・特徴量作成の流れがすでにできている
- その処理を毎日・毎時間など、一定間隔で自動実行したい
- SQLとPythonが混在した処理を、できるだけ簡単に回したい
といったケースにちょうどハマる機能だと感じました。
Taskの書き方や構造を深く理解しなくても、Notebookという慣れた形のまま自動化できる点は、分析寄りの作業をしている人にとって大きなメリットです。
また、Snowflakeのドキュメントにもある通り、NotebookはEXECUTE NOTEBOOK を使って外部のスケジューラから実行することもできます。そのため、より大きな処理フローの一部として Notebookを組み込む、といった使い方も可能です。
4. まとめ
今回は、Snowflake Notebooksを使ってSQLとPythonを組み合わせたデータ変換処理を作成し、そのNotebookをスケジューリング実行する流れを紹介しました。
Notebook上で処理を実装し、そのまま定期実行の設定までを行えるため、実装から運用までを一つの画面で簡単に完結させられる点がとても便利だと感じました。
また、Snowflake上にはAI関連の機能も用意されているため、そういった機能をNotebook上で組み合わせ、よりリッチなデータ分析フローをスケジューリング実行する、といった使い方も試してみたいと感じました。
最後までお読みいただき、ありがとうございました。
本記事が、Snowflake Notebooksの活用イメージを掴む一助になれば幸いです。
5. 仲間募集
NTTデータ ソリューション事業本部 では、以下の職種を募集しています。
Snowflake、生成AIを活用したデータ基盤構築/活用支援(Snowflake Data Superheroesとの協働)
Databricks、生成AIを活用したデータ基盤構築/活用支援(Databricks Championとの協働)
プロジェクトマネージャー(データ分析プラットフォームソリューションの企画~開発~導入/生成AI活用)
クラウドを活用したデータ分析プラットフォームの開発(ITアーキテクト/PM/クラウドエンジニア)
6. ソリューション紹介
Trusted Data Foundationについて
~データ資産を分析活用するための環境をオールインワンで提供するソリューション~
最新のクラウド技術を採用して弊社が独自に設計したリファレンスアーキテクチャ(Datalake+DWH+AI/BI)を顧客要件に合わせてカスタマイズして提供します。
可視化、機械学習、DeepLearningなどデータ資産を分析活用するための環境がオールインワンで用意されており、これまでとは別次元の量と質のデータを用いてアジリティ高くDX推進を実現できます。
TDFⓇ-AM(Trusted Data Foundation - Analytics Managed Service)について
~データ活用基盤の段階的な拡張支援(Quick Start) と保守運用のマネジメント(Analytics Managed)をご提供することでお客様のDXを成功に導く、データ活用プラットフォームサービス~ TDFⓇ-AMは、データ活用をQuickに始めることができ、データ活用の成熟度に応じて段階的に環境を拡張します。プラットフォームの保守運用はNTTデータが一括で実施し、お客様は成果創出に専念することが可能です。また、日々最新のテクノロジーをキャッチアップし、常に活用しやすい環境を提供します。なお、ご要望に応じて上流のコンサルティングフェーズからAI/BIなどのデータ活用支援に至るまで、End to Endで課題解決に向けて伴走することも可能です。
NTTデータとSnowflakeについて
NTTデータとSnowflakeについて
NTTデータでは、Snowflake Inc.とソリューションパートナー契約を締結し、クラウド・データプラットフォーム「Snowflake」の導入・構築、および活用支援を開始しています。
NTTデータではこれまでも、独自ノウハウに基づき、ビッグデータ・AIなど領域に係る市場競争力のあるさまざまなソリューションパートナーとともにエコシステムを形成し、お客さまのビジネス変革を導いてきました。
Snowflakeは、これら先端テクノロジーとのエコシステムの形成に強みがあり、NTTデータはこれらを組み合わせることでお客さまに最適なインテグレーションをご提供いたします。
NTTデータとDatabricksについて
NTTデータは、お客様企業のデジタル変革・DXの成功に向けて、「databricks」のソリューションの提供に加え、情報活用戦略の立案から、AI技術の活用も含めたアナリティクス、分析基盤構築・運用、分析業務のアウトソースまで、ワンストップの支援を提供いたします。
NTT DATA公式アカウントです。 技術を愛するNTT DATAの技術者が、気軽に楽しく発信していきます。 当社のサービスなどについてのお問い合わせは、 お問い合わせフォーム nttdata.com/jp/ja/contact-us/ へお願いします。