Snowparkは、Python・Scala・JavaからSnowflake内のデータをプログラマブルに処理するための開発フレームワークです。 すべてのDataFrame操作はSnowflakeのウェアハウス上で実行されるため、 データをSnowflakeの外に移動させる必要がありません。 Lazy evaluationによりアクション呼び出しまでSQLは発行されず、 Snowflake Optimizerが最適な実行計画を生成します。
| 項目 | 内容 |
|---|---|
| 問題数 | 65問 |
| 制限時間 | 115分 |
| 受験料 | $225 USD |
| 合格ライン | 750点 / 1000点 |
| 前提資格 | SnowPro Core認定 |
| 有効期間 | 2年(更新試験あり) |
| ドメイン | 配点 | 主なトピック |
|---|---|---|
| Snowflake Core Knowledge | 約15% | アーキテクチャ、ウェアハウス、キャッシュ、セキュリティ |
| DataFrame API | 約30% | Session、DataFrame操作、Lazy eval、Window関数 |
| UDF / UDTF / Stored Procedure | 約25% | スカラーUDF、Vectorized UDF、UDTF、Sproc、権限 |
| Data Engineering | 約15% | ファイル操作、Dynamic Table、Tasks、Streams |
| ML Integration | 約15% | Snowpark ML、モデルレジストリ、Feature Store |
SnowparkのDataFrame APIはSpark風のメソッドチェーンでデータ処理を記述します。各メソッドはSQLに変換されるため、Snowflake Optimizerが最適化を行います。
| メソッド | 用途 | SQL相当 |
|---|---|---|
| select() | カラム選択 | SELECT col1, col2 |
| filter() / where() | 行のフィルタリング | WHERE 条件 |
| group_by().agg() | グループ集計 | GROUP BY + 集計関数 |
| join() | テーブル結合 | JOIN ... ON |
| with_column() | カラム追加・変換 | SELECT ..., expr AS alias |
| sort() / order_by() | ソート | ORDER BY |
| collect() | 結果取得(アクション) | クエリ実行+結果返却 |
| show() | 結果表示(アクション) | クエリ実行+コンソール出力 |
| write.save_as_table() | テーブル保存(アクション) | CREATE TABLE AS SELECT |
from snowflake.snowpark import Session
from snowflake.snowpark.functions import col, sum as sum_, avg, count
session = Session.builder.configs(connection_params).create()
# Lazy evaluation: この時点ではSQLは実行されない
df = session.table("SALES")
result = (
df.filter(col("SALE_DATE") >= "2026-01-01")
.group_by("REGION", "PRODUCT_CATEGORY")
.agg(
sum_("AMOUNT").alias("TOTAL_SALES"),
avg("AMOUNT").alias("AVG_SALE"),
count("ORDER_ID").alias("ORDER_COUNT"),
)
.sort(col("TOTAL_SALES").desc())
)
# collect() でSQLが発行されSnowflake上で実行
rows = result.collect()
for row in rows:
print(f"{row['REGION']}: {row['TOTAL_SALES']}")| 観点 | UDF | UDTF | Stored Procedure |
|---|---|---|---|
| 呼び出し方 | SELECT内(スカラー関数) | FROM句(TABLE(func())) | CALL文 |
| 戻り値 | スカラー値(1行1値) | テーブル(複数行) | 任意(副作用が主目的) |
| 副作用 | 不可(純粋関数) | 不可(純粋関数) | 可(DDL/DML実行可) |
| 権限モデル | Caller Rights | Caller Rights | Caller Rights / Owner Rights |
| 言語 | Python / Scala / Java / SQL | Python / Scala / Java / SQL | Python / Scala / Java / SQL / JavaScript |
from snowflake.snowpark.functions import udf
from snowflake.snowpark.types import StringType, IntegerType
# インラインUDF
@udf(name="calculate_tax", return_type=IntegerType(),
input_types=[IntegerType()], replace=True, is_permanent=False)
def calculate_tax(amount: int) -> int:
return int(amount * 0.1)
# SQL呼び出し: SELECT calculate_tax(AMOUNT) FROM ORDERS;
# --- UDTF定義例 ---
from snowflake.snowpark.functions import udtf
from snowflake.snowpark.types import StructType, StructField
class SplitTags:
def process(self, tags: str):
for tag in tags.split(","):
yield (tag.strip(),)
session.udtf.register(
SplitTags,
output_schema=StructType([StructField("TAG", StringType())]),
input_types=[StringType()],
name="split_tags",
replace=True,
)
# SQL呼び出し: SELECT * FROM TABLE(split_tags('ml,ai,data'));from snowflake.snowpark.functions import sproc
@sproc(name="refresh_summary", replace=True, is_permanent=True,
stage_location="@DEPLOY_STAGE",
packages=["snowflake-snowpark-python"])
def refresh_summary(session: Session) -> str:
source = session.table("RAW_EVENTS")
summary = (
source.group_by("EVENT_TYPE")
.agg(count("*").alias("CNT"))
)
summary.write.save_as_table("EVENT_SUMMARY", mode="overwrite")
return "EVENT_SUMMARY refreshed"
# 実行: CALL refresh_summary();Vectorized UDFはpandas.Seriesを入出力に取り、行単位ではなくバッチ単位で処理するため通常のUDFより高速です。数値計算やML推論でパフォーマンスが求められる場面に適しています。
from snowflake.snowpark.functions import pandas_udf
from snowflake.snowpark.types import PandasSeriesType, IntegerType
import pandas as pd
@pandas_udf(name="batch_normalize", return_type=PandasSeriesType(IntegerType()),
input_types=[PandasSeriesType(IntegerType())],
replace=True)
def batch_normalize(series: pd.Series) -> pd.Series:
mean = series.mean()
std = series.std()
return ((series - mean) / std * 100).astype(int)
# SQL: SELECT batch_normalize(SCORE) FROM EXAM_RESULTS;
# バッチ処理により行単位UDFの数十倍の速度Snowpark MLはSnowflake上でMLモデルのトレーニングと推論を完結させるライブラリです。scikit-learn互換のAPIでfit/predictを実行でき、モデルはSnowflake Model Registryに登録して本番デプロイします。
from snowflake.ml.modeling.linear_model import LogisticRegression
from snowflake.ml.registry import Registry
# トレーニング
train_df = session.table("TRAINING_DATA")
model = LogisticRegression(
input_cols=["FEATURE_A", "FEATURE_B", "FEATURE_C"],
label_cols=["LABEL"],
output_cols=["PREDICTION"],
)
model.fit(train_df)
# 推論
test_df = session.table("TEST_DATA")
predictions = model.predict(test_df)
predictions.write.save_as_table("PREDICTIONS", mode="overwrite")
# モデル登録
reg = Registry(session)
mv = reg.log_model(
model,
model_name="churn_classifier",
version_name="v1",
sample_input_data=train_df.limit(10),
)| Snowpark MLコンポーネント | 役割 |
|---|---|
| snowflake.ml.modeling | scikit-learn互換のML API(前処理・学習・推論) |
| Model Registry | モデルのバージョン管理とデプロイ |
| Feature Store | 特徴量の管理・共有・ポイントインタイム結合 |
SPCSはSnowflake上でDockerコンテナを実行するマネージドサービスです。Snowparkが主にDataFrame操作とUDF/Sprocの実行を担うのに対し、SPCSはGPUベースのモデルトレーニング、カスタムREST API、フルスタックWebアプリケーションなどの汎用ワークロードを実行できます。
| 観点 | Snowpark UDF/Sproc | SPCS |
|---|---|---|
| 実行モデル | SQL関数 / CALL文 | 長時間実行のコンテナサービス |
| GPU | 非対応 | 対応 |
| 外部ネットワーク | 制限あり | External Access Integration経由で可 |
| ユースケース | データ変換、軽量ML推論 | 大規模MLトレーニング、カスタムAPI、Webアプリ |
| 期間 | フェーズ | 学習内容 |
|---|---|---|
| 月1〜2 | Core復習+Python基礎 | Snowflakeアーキテクチャ、Python/pandasの基本操作 |
| 月3〜4 | DataFrame API集中 | Session構築、DataFrame操作、Window関数、ファイルI/O |
| 月5〜6 | UDF / UDTF / Sproc | 各種定義方法、Vectorized UDF、権限モデル、パッケージ管理 |
| 月7〜8 | Data Engineering + ML | Dynamic Table、Streams/Tasks、Snowpark ML、Model Registry |
| 月9〜12 | 模擬試験+弱点補強 | 本番形式65問の模擬試験を複数回、間違えたドメインの再学習 |
Snowpark
問題 1
SnowparkでPython UDFを作成し、SELECT文のカラムに適用して各行のテキストデータに対してカスタム変換を行いたい。UDFの戻り値は単一のスカラー値です。また、大量の行を処理するため行単位ではなくバッチ処理で高速化したい場合、最も適切な実装方法はどれですか?
正解: A
大量行のバッチ処理にはVectorized UDF(@pandas_udf)が最適です。pandas.Seriesを入出力とすることで行単位の関数呼び出しオーバーヘッドを削減し、通常のUDFより大幅に高速化できます。Bのis_permanentはUDFの永続化設定であり速度には影響しません。CのUDTFはテーブル(複数行)を返すため、スカラー値を返す要件に合いません。DのStored ProcedureはCALL文で実行するもので、SELECT文内での行ごとの適用には使えません。
SnowparkのDataFrame APIとSparkのDataFrame APIはどう違いますか?
SnowparkのDataFrame APIはSpark DataFrameに似た構文(select, filter, group_by, joinなど)を提供しますが、処理の実行場所が根本的に異なります。Sparkではドライバとエグゼキュータで分散処理しますが、SnowparkではすべてのDataFrame操作がSQLに変換されSnowflakeのウェアハウス上で実行されます。つまりデータはSnowflakeの外に出ず、Snowflake Optimizerの恩恵を受けます。また、SnowparkはLazy evaluationを採用しており、collect()やshow()などのアクションを呼ぶまで実際のSQLは実行されません。
UDF、UDTF、Stored Procedureはそれぞれどのような場面で使い分けますか?
UDF(User-Defined Function)はSELECT文の中でスカラー値を返す関数として使います。行ごとの変換やカスタム計算に適しています。UDTF(User-Defined Table Function)はFROM句で呼び出し、入力行に対して複数行を返すテーブル関数です。JSONの展開やログのパースなどに使います。Stored ProcedureはCALL文で実行し、DDL/DMLの発行や複数ステップの処理フローを記述できます。副作用(テーブル作成・データ変更)を伴う処理にはStored Procedureが適しています。試験ではこの3つの呼び出し方法と戻り値の違いが頻出します。
Snowpark Container Servicesとは何ですか?Snowparkとの関係は?
Snowpark Container Services(SPCS)はSnowflake上でDockerコンテナを実行するためのマネージドサービスです。Snowparkが主にDataFrame操作やUDF/UDTF/Stored Procedureの実行を担うのに対し、SPCSはフルスタックアプリケーション、GPUベースのMLモデルトレーニング、カスタムREST APIなど、より汎用的なワークロードをSnowflake内で実行できます。SnowparkのStored ProcedureからSPCS上のサービスを呼び出す連携パターンもあります。試験ではSPCSが「コンテナベースの処理」として選択肢に登場します。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...