❄️

Frosty Friday Live Challenge @SnowVillageにみんなも参加しよう!

に公開

今回、がくさんからお声がけいただき、なんとFrosty Friday Live Challengeにゲスト参加することとなりました!

https://www.youtube.com/watch?v=5tRqCOHHGEM

ホストは、tomoさんがくさんあれさん
ゲストは、あすむるとさん

Frosty Friday Live Challenge @SnowVillageとは

Frosty Friday Live Challengeは、Snowflakeユーザーコミュニティ「SnowVillage」が運営する、エンジニア向けのスキルアップ配信チャレンジ番組です!
Frosty Fridayが提供する、Snowflakeの実践的な課題に隔週で挑戦し、SQLやPython、Snowpark、Streamlitなどの最新機能を駆使した課題解決や、Snowflakeの最新機能やコミュニティ内外での新しい事例や記事などの紹介を行う、皆さんのSnowflake活用をレベルアップしてくれる超お役立ちチャンネルです!

https://www.youtube.com/@DATACLOUD/videos

Frosty Fridayとは

https://frostyfriday.org/
Snowflakeのユーザーが運営する有志のサイトで、Snowflakeユーザーの、Snowflakeユーザーによる、Snowflakeユーザーのために作成した、Snowflake スキルの練習と開発に役立つ、毎週金曜日に公開されるウィークリー チャレンジサイトです。(TableauのMakeover Mondayにインスパイアされた取組みとか?)
8月22日時点で145回まで作られているので、これをすべて達成すれば上級者どころかトップエキスパート入り!
Frosty Friday Live Challenge @SnowVillage ではこれらを事前にクリアしたゲストが、紹介しながら解いていくスタイルで配信しており、私が第66回を担当させてもらいました!

Frosty Friday Live Challenge(FFLC)を視聴することで得られること

  • 最新トレンドのキャッチアップ
    Snowflakeの新機能や業界ニュースを毎回紹介。データ基盤のモダン化やAI活用に関心のある方に最適です。

  • 収録型ライブコーディング&解説
    有志エンジニアが収録時にその場で課題に挑戦し、プロセスや実装のコツをリアルタイムで解説。
    配信はYouTubeで公開され、アーカイブも視聴可能です。

  • コミュニティ参加型
    エントリーすれば、誰でもチャレンジに参加でき、解答やアイデアをコミュニティで共有・議論できます。

こんな方におすすめ

  • Snowflakeやデータ基盤技術を深く学びたいエンジニア
  • SQLやPython、Snowparkなどの実践力を高めたい方
  • コミュニティで切磋琢磨したい方

FFLCへのゲスト参加と記事化

FFLCは毎回視聴しているのですが、いざ自分がゲスト参加するとなると色々準備や練習をしたり、手順を覚える意味で記事にしました!
またせっかくなので参加してみたいなーと思っている人にどんな流れかまとめることで安心してチャレンジできるのでは?と思い、詳しく書くようにしました!

周りからそう思われていないようなのですが、心配性の準備魔ですw
なので、出る前から不安でいっぱいです。

という訳で登壇までの流れと準備をまとめました。

登壇の流れ

事前準備

  • チャレンジャー枠応募:Snowvillage-Slackのfrosty-fridayチャネルにあるChallengeListを確認して、空き枠に応募する
  • 段取り確認:SlackかXなどで運営の皆さんから参加確定の連絡をもらい、段取りに従い準備する
  • 自己紹介準備:自己紹介シートのテンプレにもらい、事前作成する
  • お題の解答:Frosty-Fridayのお題を解く(先に解いてGithubにソースをアップ)
  • 解答イメージ:お題解答のライブイメージを固める
  • 明鏡止水:心穏やかに身なりを整え、当日を迎える

収録当日

  • 収録のZoomに参加:大体配信日の前週木曜の22時開始
  • 収録前のブリーフィング:What's NewやPick Upのテーマの割り振りに手を上げる
  • 収録開始:笑顔を絶やさず、リアクション頑張る!
  • 収録中:編集可能なので、ミスったと思ったら、遠慮なくリテイクするw
    良いことを言おうとせず、素直に思ったことを話しましょう!考えると大体失敗するw
    お題解答のライブデモを頑張る!ミスったらミスったでそれも楽しむw
    最後まで笑顔で頑張る!
  • 収録後:全員で感想を言って、おつかれさまでした!

収録後

  • 配信まで:配信を楽しみにする、告知があったら、リツイートする!
  • 配信中 :気になることがあっても気にしないw
  • 配信後 :次回の応募を行うw

事前準備のポイント

チャレンジャー枠応募
チャレンジャーリストより、空き枠をさがしましょう

  • 空き枠には、以下の難易度設定がありますので参考にしてください。
    • Basic(基礎)
    • Intermediate(中級)
    • Advanced(上級)
    • Hard(エキスパート)
  • 難易度の定義がイマイチ分かりませんので、お題を確認して、自分が出来そうなものを選ぶと良いでしょう
  • ちなみに私は強制的にテーマ選ばれたので必死こいて調べましたw(Snowpark触った事ないです)

自己紹介準備
自己紹介シートのテンプレにもらい、事前作成しましょう

  • 自己紹介シートの作成
    • 顔写真 or イラスト or Xのアイコンなど
    • 自分の仕事内容や所属会社(任意)、趣味など
    • なんかちょっと興味を湧いてもらえる一言コメント

私、こんな感じw

お題の解答
当日、Frosty-Fridayの課題を事前に解答しておきましょう。解答時のソースなどをGitHubにアップしておきましょう。この辺りは後述で私の手順も共有しておきます。

解答イメージ
ただ解答するだけだと割とすぐ終わってしまうので、5~10分ぐらいのデモになるように流れを作成しましょう。
また人によって解答スタイルも色々あります。ささっとやる人、丁寧に説明してくれる人、めっちゃ早い人、楽しそうにやる人、雑談しまくる人、どれも正解です!
アーカイブを視聴して他の人の解答スタイルも見た上で、自分に合ったスタイルでやるのが良いでしょう。(めっちゃ予習したw)

共通した流れ

  • 最初にお題の紹介
  • 流れの説明
  • 実装コード
  • 検証方法
  • 解答まとめ
  • やってみた感想

明鏡止水
心穏やかに身なりを整え、当日を迎えましょう。緊張で1時間ぐらい前から待機するのは良くあることです。お風呂に入るなどゆったりとした気持ちを保ちましょう。

なんだか、のどが渇きます。飲み物は準備しましょう。なんだか、トイレに行きたくなります。本能に従いましょう。なんだか、汗が出てきます。エアコンは強めにしましょう。

収録当日のポイント

収録のZoomに参加
配信日の前週木曜の22時開始ですが、皆さん多少遅れる事もあります。私は5分前からZoomに入って待機してました。22時過ぎて、みんな来ないので不安になりましたw
あと、Zoomの名前は必要に応じて、Xのアカウントと揃えたり、社名を外すなど適宜調整しましょう。背景もその日の気分に合うものにしましょう。
ちなみに今回は服装はData SuperheroのSwagを着て参加したので、暑かったので、エアコンはガンガンにかけてましたw

収録前のブリーフィング
メンバーが揃ったら、収録の流れの説明があり、「What's New」や「Pick Up」のテーマが共有されます。会話しながら運営とゲストで割り振りしますので、自分が話せそうなテーマを選びましょう。

収録中
編集可能なので、ミスったと思ったら、遠慮なくリテイクしましょう。私、自己紹介は頭2秒でリテイクしましたw

What's NewやPickUpはその日のテーマが決まるので、自分の担当テーマで話したい事やどう伝えたらいいか?みたいないことをみんなとワイワイやるながら、裏でメモしたり、AIと仕様を確認したり、意外と忙しいです。即興で話せる人ってホント偉い!(準備魔)
そして、こういう時、無表情になりがちなのでとにかく口角だけは上げておきましょう!

後、他の方が話したテーマに合いの手を入れたり、この辺はタイミングはなかなか難しいですが、被ってもいいや!の精神が大事です。

またほかの人の話を聞く時、無表情になってしまうと怖い感じに映るので、とにかく笑顔を絶やさず、リアクション頑張りましょう。いっそアバターにするのもありだと思います!(あすむるとさんのアバター可愛かった!)

ライブデモ
上手く行かない事があっても気にせず、リテイクしましょう。楽しくやるのが一番です!他の人がチャレンジしている時も笑顔で応援しましょう!
この辺からだいぶ緊張も解けてきたのと、いい加減熱くなってきたのでSwagを脱いだことで、だいぶリラックスしていました。

まとめ
皆で今日の感想を言いあって収録完了です。おつかれさまでした!!

収録後

収録後は翌週の配信を楽しみにし、告知があったら、SNSなどでも告知に協力しましょう。
そして実際の配信をイチユーザーとして楽しみましょう!
視聴後はFrosty-Fridayのチャレンジャー募集に再び応募しましょう!

ここまでの流れを読んでいただいた皆さんは今すぐFrosty-Fridayに応募いただけたと思いますが、そもそもお題を解くのが難しいというあなたはお題の解き方と流れについても解説したいと思います!

Frosty-Friday Week_066の解説

さてここからは話変わって、私が担当した第66回 Frosty Friday Snowparkチャレンジは、Snowflake上でPython(Snowpark)を使って特定条件を満たすテーブルを抽出するについて問題の解法についてまとめたいと思います。

https://frostyfriday.org/blog/2023/10/06/week-66-intermediate/comment-page-1/

このセッションの目的は、SnowflakeにおけるSnowpark(Pythonなどによるコーディング機能)の活用方法を学び、SQL以外のアプローチでデータ操作を行うスキルを身につけることにあります。
と言いながら、私自身は基本的にSQLエンジニアで、いまだにPythonは見様見真似のへっぽこエンジニアです。
なので自身の勉強とその振り返り、あとFFに参加した時に絶対手順忘れるのでそのカンペとして記事にしておこうと思いました。

という訳で、一般的なSnowflakeの知識がある前提で、ハンズオンの具体的手順をステップバイステップで解説します。

これらの流れを学ぶことで、Frosty Fridayにチャレンジャーしたいと思う人、がどのような手順で行えば良いか理解しやすくなり、チャレンジャーがさらに増えると良いなと思っています!

Frost Fridayを始める際の私の不安

今までもFrost Fridayに参加しようと思ったことはあるのですが、まず英語のサイトであること、エンジニアらしい端的な説明で、何をどこまでやったらいいかが良く分からず、そっとサイトを閉じていました。運営者側や英語圏のゴリゴリのエンジニアは知識も経験・スキルもあるので、問題ないのでしょうが、初めてチャレンジする人からするとすこーし不親切なところがあるな~と思っています。(私だけ?)

問題の理解を高め、安心してチャレンジしよう

Frosty Fridayのサイトに記載している情報はかなり情報量が少なすぎるので、生成AIのアドバイスなどをもらいながら、問題の理解や実施方法の理解を高めましょう。

AIに聞いてみよう:プロンプト例

Snowflake Frosty Friday にチャレンジすることとなった。このサイトはSnowflakeの技術や機能の理解を高めるためのチャレンジテーマを提供してくれている。一方でサイトのチャレンジ情報が端的なので、私が実施する第66回の問題テーマや実施方法を解説して欲しい。
- 実施方法の解説は具体的な手順とその意図を補足し、ただ作業をするのではなく、理解を高める手順にすること
- またその実施手順の中で、テーマから逸脱しない範囲で学ぶべきテーマや要素があればそれらも提示すること
- 解法に複数選択肢がある場合はそれらも吟味して手順を提案すること
- 実施手順についてはステップバイステップで初心者でも迷わないように配慮すること

- 問題テーマのURLは以下
https://frostyfriday.org/blog/2023/10/06/week-66-intermediate/

前提条件と準備

  • 必要な知識・環境: Snowflakeで基本的なクエリ操作ができること、テーブルやスキーマの概念を理解していること、およびPythonの基本的なコードが読めることを前提とします。また、Snowflake上でSnowpark (Pythonランタイム) を利用するため、SnowflakeのWeb UI「Snowsight」でPythonワークシート (Python Worksheet) を使用できる環境が必要です。SnowsightでPythonワークシートを初めて使う場合、Anaconda利用規約の承諾を求められるので事前に承諾しておきましょう。加えて、Snowparkのコード実行に使用する仮想ウェアハウスは開発用途であれば小さめのサイズ(X-Small程度)を選択すると良いです

https://docs.snowflake.com/en/developer-guide/snowpark/python/python-worksheets

  • 権限とデータソース: 本チャレンジではSnowflakeが提供するAccount Usageデータベース内のTABLESビューを利用してアカウント内すべてのテーブル情報を取得します。実行ユーザにこのビューへのアクセス権限が必要です。通常、ACCOUNTADMINロールなどでは問題ありませんが、もし権限がない場合は、自分の使用するスキーマのINFORMATION_SCHEMA.TABLESビューで代替することも可能です。ただしAccount UsageのTABLESビューには過去に削除されたテーブルも含まれる点が有用ですhttps://docs.snowflake.com/en/sql-reference/account-usage/tables

  • GitHub準備: ハンズオンの最後にコードをGitHubで共有するため、あらかじめGitHubアカウントにログインしておいてください(未登録の場合は無料でアカウントを作成できます)。ブラウザからのアップロード方法を解説するので、Gitやターミナルの知識は不要です。


Snowparkを用いたテーブル条件フィルタリング: 手順概要

Step 1: Snowparkワークシートのセットアップ

  1. Pythonワークシートを開く: SnowflakeのSnowsight UIで新規ワークシートを開き、言語モードを「Python」に切り替えます。これにより、Snowflake上でPython(Snowpark)コードを実行できる環境が整います。SnowsightでPythonワークシートを作成すると、自動的にテンプレートが表示されるので削除しましょう。

Pythonワークシートを選択
わたし、Snowflake5年目で、初めてPythonシートを選択したよ・・

  1. Start Up Codeの貼り付け
    課題にコードが貼られているので、そちらを貼り付けてまずは実行してみる。
import snowflake.snowpark as snowpark
from snowflake.snowpark.functions import col

def main(session: snowpark.Session): 
    tableName = 'snowflake.account_usage.tables'
    dataframe = session.table(tableName)

    return dataframe

とりえず、Start Up Codeは動きましたw

Step 2: テーブルデータの取得

  1. Account UsageのTABLESビューを取得: Snowparkのsessionオブジェクト経由で、SnowflakeのAccount Usageデータベースに含まれるテーブル情報のビューSNOWFLAKE.ACCOUNT_USAGE.TABLESを読み込みます。このビューにはアカウント内のすべてのテーブルとビューのメタデータが含まれています。

    上記のようにsession.table("<データベース>.<スキーマ>.<テーブル名>")と指定すると、そのテーブルをSnowparkのDataFrame(データフレーム)オブジェクトとして取得できます。ここではdf_tablesというDataFrame変数にAccount Usage上の全テーブル情報を格納しました。この時点ではまだフィルタをかけていないため、df_tablesには一時テーブル/削除済みテーブルも含むすべてのテーブル・ビューの情報が入っています。

    ℹ️ 補足: Account UsageのTABLESビューにはテーブル名やスキーマ、データベース、所有者、テーブルの種別(永久テーブル or 一時/一時的テーブル)、行数、最終変更日時、削除日時など多くの列が含まれています。この中から必要な列を次のステップで利用します。
    https://docs.snowflake.com/en/sql-reference/account-usage/tables

Step 3: 条件によるテーブルフィルタリング

  1. 抽出条件の確認: 課題で指定された条件は次の3つでした。

    There are three conditions:
    1 – the table must not be transient
    2 – the table must not have been deleted
    3 – the table must have more than 0 rows

    1. テーブルがTransient (一時/短期)テーブルではないこと
    2. テーブルが削除されていないこと
    3. テーブルの行数が0より多いこと(=1行以上データが入っていること)

    SnowflakeのACCOUNT_USAGE.TABLESビューには上記条件をチェックできるカラムが存在します。それぞれ:

    • IS_TRANSIENT: テーブルがトランジェント(一時)テーブルかどうかを示す列で、値がNOであれば通常の永続テーブルです。
    • DELETED: テーブルが削除された日時が入る列で、値がNULLの場合はまだ削除されていない現存テーブルであることを意味します。
    • ROW_COUNT: テーブルに含まれる行数を示す数値列で、この値が0より大きければデータが入っていることになります。
  2. DataFrameへのフィルタ適用: 上記の条件を用いて、df_tablesから目的のテーブルのみを絞り込みます。SnowparkではDataFrame.filter()メソッドに条件式を渡すことでフィルタリングが可能です。条件式には先ほどインポートしたcol関数で各列を指定し、Pythonの演算子で比較を行います(複数条件は&でAND結合します)。

        df_filtered = df_tables.filter(
            (col("IS_TRANSIENT") == "NO") & 
            (col("DELETED").is_null()) & 
            (col("ROW_COUNT") > 0)
        )
    

    ここでは、IS_TRANSIENT列が文字列"NO"に等しい、かつDELETED列がNULLである、かつROW_COUNT列が0より大きい、という3つの条件を全て満たす行だけがdf_filteredに残るようになります。それぞれの条件は上述の通り、非一時テーブル未削除1行以上をチェックしています。col("DELETED").is_null()のように、Snowparkではカラムオブジェクトに対してis_null()メソッドを呼ぶことでNULL判定ができます。

    フィルタリング処理はSnowflake側で行われるため、大量のテーブル情報があっても効率的に絞り込まれます。

Step 4: 結果の確認

という訳でクエリを生成できそうですが、自分の結果の妥当性を確認するために実際にテスト対象のテーブルを作成して検証したいと思います。

1.テストデータの作成
今回の条件を満たすため、新規のDBを作成し、お題にある3つの条件を満たすためのテストデータを作成します。

  1. テーブルがTransient (一時/短期)テーブルではないこと
  2. テーブルが削除されていないこと
  3. テーブルの行数が0より多いこと(=1行以上データが入っていること)
    上記に加え、通常のテーブルで件数が1件以上ある削除していないテーブル

詳細手順は以下のアコーディオンにまとめています。(長いので折りたたんでます)

テストデータ作成・確認手順
-- ACCOUNTADMINで実行
USE ROLE ACCOUNTADMIN;

CREATE  ROLE FROSTY_FRIDAY;
CREATE WAREHOUSE FROSTY_FRIDAY_XS;
CREATE DATABASE FROSTY_FRIDAY ;
CREATE SCHEMA FROSTY_FRIDAY.WEEK_066 ;

GRANT USAGE ON WAREHOUSE FROSTY_FRIDAY_XS TO ROLE FROSTY_FRIDAY;
GRANT USAGE ON WAREHOUSE FROSTY_FRIDAY_SP_S TO ROLE FROSTY_FRIDAY;
GRANT USAGE ON DATABASE FROSTY_FRIDAY TO ROLE FROSTY_FRIDAY;
GRANT USAGE ON SCHEMA FROSTY_FRIDAY.WEEK_066 TO ROLE FROSTY_FRIDAY;
GRANT SELECT ON ALL TABLES IN SCHEMA FROSTY_FRIDAY.WEEK_066 TO ROLE FROSTY_FRIDAY;

-- ACCOUNT_USAGEスキーマへのアクセステスト
USE ROLE frosty_friday;
SELECT COUNT(*) FROM SNOWFLAKE.ACCOUNT_USAGE.TABLES;

-- 通常のテーブル作成
USE ROLE ACCOUNTADMIN;
USE DATABASE FROSTY_FRIDAY;
USE SCHEMA WEEK_066;

CREATE TABLE demo_normal_table (
    id INTEGER,
    name STRING,
    created_date DATE
);

-- データ挿入(ROW_COUNT > 0 にするため)
INSERT INTO demo_normal_table VALUES 
(1, 'Sample Data 1', '2025-01-01'),
(2, 'Sample Data 2', '2025-01-02'),
(3, 'Sample Data 3', '2025-01-03');

-- 一時的テーブル作成(条件1に引っかかる)
CREATE TRANSIENT TABLE demo_transient_table (
    id INTEGER,
    name STRING,
    created_date DATE
);

-- データ挿入
INSERT INTO demo_transient_table VALUES 
(1, 'Transient Data 1', '2025-01-01'),
(2, 'Transient Data 2', '2025-01-02');


-- 空のテーブル作成(条件3に引っかかる)
CREATE TABLE demo_empty_table (
    id INTEGER,
    name STRING,
    created_date DATE
);

-- データは挿入しない(ROW_COUNT = 0)


-- 削除対象テーブル作成
CREATE TABLE demo_to_be_deleted (
    id INTEGER,
    name STRING,
    created_date DATE
);

-- データ挿入
INSERT INTO demo_to_be_deleted VALUES 
(1, 'Will be deleted', '2025-01-01');

-- テーブル削除(条件2に引っかかる)
DROP TABLE demo_to_be_deleted;

-- ACCOUNT_USAGEから確認(反映にラグがあるので注意 10分ぐらい?最初全然出なくて焦る私)
SELECT 
*
FROM SNOWFLAKE.ACCOUNT_USAGE.TABLES 
WHERE TABLE_NAME LIKE 'DEMO_%' 
    AND TABLE_CATALOG = 'FROSTY_FRIDAY'
    AND TABLE_SCHEMA = 'WEEK_066'  -- 修正箇所
ORDER BY TABLE_NAME;

-- 現在のデータベースのテーブル情報(こっちは即時で見える)
USE DATABASE FROSTY_FRIDAY;

SELECT 
    TABLE_CATALOG,
    TABLE_SCHEMA, 
    TABLE_NAME,
    TABLE_TYPE,
    IS_TRANSIENT,
    ROW_COUNT,
    BYTES,
    CREATED,
    LAST_ALTERED
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = 'WEEK_066'
ORDER BY TABLE_NAME;

上記の結果、WEEK_066の4つのテーブルが確認出来ました。

TABLE_ID TABLE_NAME TABLE_SCHEMA_ID TABLE_SCHEMA TABLE_CATALOG_ID TABLE_CATALOG TABLE_OWNER TABLE_TYPE IS_TRANSIENT IS_ICEBERG IS_DYNAMIC IS_HYBRID CLUSTERING_KEY ROW_COUNT BYTES RETENTION_TIME SELF_REFERENCING_COLUMN_NAME REFERENCE_GENERATION USER_DEFINED_TYPE_CATALOG USER_DEFINED_TYPE_SCHEMA USER_DEFINED_TYPE_NAME IS_INSERTABLE_INTO IS_TYPED COMMIT_ACTION CREATED LAST_ALTERED LAST_DDL LAST_DDL_BY DELETED AUTO_CLUSTERING_ON COMMENT OWNER_ROLE_TYPE INSTANCE_ID
253958 DEMO_EMPTY_TABLE 277 WEEK_066 37 FROSTY_FRIDAY ACCOUNTADMIN BASE TABLE NO NO NO NO 0 0 1 YES YES 2025-08-21 03:45:35.372 -0700 2025-08-21 03:45:35.490 -0700 2025-08-21 03:45:35.372 -0700 CCC_04595 NO ROLE
253954 DEMO_NORMAL_TABLE 277 WEEK_066 37 FROSTY_FRIDAY ACCOUNTADMIN BASE TABLE NO NO NO NO 3 1536 1 YES YES 2025-08-21 03:44:57.887 -0700 2025-08-21 03:44:59.681 -0700 2025-08-21 03:44:57.887 -0700 CCC_04595 NO ROLE
254978 DEMO_TO_BE_DELETED 277 WEEK_066 37 FROSTY_FRIDAY ACCOUNTADMIN BASE TABLE NO NO NO NO 1 1536 1 YES YES 2025-08-21 03:45:49.892 -0700 2025-08-21 03:45:50.986 -0700 2025-08-21 03:45:50.986 -0700 CCC_04595 2025-08-21 03:45:50.974 -0700 NO ROLE
253956 DEMO_TRANSIENT_TABLE 277 WEEK_066 37 FROSTY_FRIDAY ACCOUNTADMIN BASE TABLE YES NO NO NO 2 1536 1 YES YES 2025-08-21 03:45:19.636 -0700 2025-08-21 03:45:21.472 -0700 2025-08-21 03:45:19.636 -0700 CCC_04595 NO ROLE

という訳でこのうち、Week_066.DEMO_NORMAL_TABLEの1件だけが抽出されるべき対象です。
SNOWFLAKEはついでに出ちゃうけど、特に確認不要。

この情報を元にまずはPythonで同じレコードを抽出できるか?を確認したいと思います。

Snowpark上で以下のテーブルリストを出力してみる

import snowflake.snowpark as snowpark
from snowflake.snowpark.functions import col

def main(session: snowpark.Session):
    # ACCOUNT_USAGE.TABLES を参照し、必要なフィルタとソートを適用
    df_result = (
        session.table("SNOWFLAKE.ACCOUNT_USAGE.TABLES")
        .filter(
            col("TABLE_CATALOG").isin("SNOWFLAKE", "FROSTY_FRIDAY")   # データベースフィルタ
        )
        .select(
            col("TABLE_NAME"),
            col("TABLE_SCHEMA"),
            col("TABLE_CATALOG"),
            col("IS_TRANSIENT"),
            col("ROW_COUNT"),
            col("DELETED")
        )
        .sort(
            col("TABLE_CATALOG"),
            col("TABLE_SCHEMA"),
            col("TABLE_NAME")
        )
    )
    
    return df_result
TABLE_NAME TABLE_SCHEMA TABLE_CATALOG IS_TRANSIENT ROW_COUNT DELETED
DEMO_EMPTY_TABLE WEEK_066 FROSTY_FRIDAY NO 0
DEMO_NORMAL_TABLE WEEK_066 FROSTY_FRIDAY NO 3
DEMO_TO_BE_DELETED WEEK_066 FROSTY_FRIDAY NO 1 2025-08-21 03:45:50.974 -0700
DEMO_TRANSIENT_TABLE WEEK_066 FROSTY_FRIDAY YES 2
ALERT_HISTORY CIS_COMMON SNOWFLAKE NO 0
AI_OBSERVABILITY_EVENTS LOCAL SNOWFLAKE NO 0
CORTEX_ANALYST_REQUESTS_RAW LOCAL SNOWFLAKE NO 0

うん、合ってる!

3.集計処理
さて、今回のお題では、データベース単位のテーブル数を集計するように指示されている。そのため、この出力結果を集計してみましょう。

import snowflake.snowpark as snowpark
from snowflake.snowpark.functions import col

def main(session: snowpark.Session):
    df = session.table("SNOWFLAKE.ACCOUNT_USAGE.TABLES")
    
    df_result = (
        df.filter(
            col("TABLE_CATALOG").isin("SNOWFLAKE", "FROSTY_FRIDAY") &
            (col("IS_TRANSIENT") == "NO") &
            (col("DELETED").is_null()) &
            (col("ROW_COUNT") > 0)
        )
        .group_by("TABLE_CATALOG")
        .count()
        .select(
            col("TABLE_CATALOG").alias("DATABASE_NAME"),
            col("COUNT").alias("TABLE_COUNT")
        )
        .sort(col("DATABASE_NAME"))
    )
    
    return df_result
DATABASE_NAME TABLE_COUNT
FROSTY_FRIDAY 1
SNOWFLAKE 5

Step 5: コードの保存

Snowflake上での分析が完了したら、作成したコードを保存しましょう。SnowsightのPythonワークシート自体も保存できますが、ここでは後で共有しやすいようローカルファイルにエクスポートします。

  1. コードのコピー: Pythonワークシート内のコード(インポートからmain関数の終わりまで)をすべて選択してコピーします。お使いのテキストエディタを開き、コピーした内容を貼り付けてください。

  2. ファイルとして保存: 貼り付けたコードを、例えばWeek_066.pyという名前で保存します。ファイル名は英数字で、内容がわかりやすい名前にしましょう。拡張子は.py(Pythonファイル)です。

  3. 秘密情報の確認: 念のため、コード中にパスワードなどの秘密情報や組織固有の情報がハードコードされていないか確認します。今回のコードにはSnowflakeの接続情報等は含まれていないはずですが、万一含まれている場合は削除またはマスキングしてください。コードを公開する前のセキュリティ確認は重要なベストプラクティスです。

  4. 動作メモ: オフラインの環境でこのコードを実行するにはSnowpark用の接続設定が別途必要ですが、Snowflake上で実行したコードそのものはこのファイルに保存された形になります。あとはこのファイルを共有すれば他の人も内容を確認できます。


GitHubへのコードアップロード

Snowparkで作成したWeek_66.pyコードをGitHubで共有する手順を説明します。GitHubを使うことで、自分の解答やスクリプトを他の人と簡単に共有・公開できます。

GitHubリポジトリの作成

  1. リポジトリの新規作成画面を開く: ブラウザでGitHubにログインし、画面右上の「+」アイコンをクリックしてNew repositoryを選択します(直接 https://github.com/new にアクセスしてもOKです)。

  1. リポジトリ情報の入力: 新規リポジトリ作成画面では以下の情報を入力します。

    • Repository name: リポジトリの名前を入力します。ここでは例としてfrosty-fridayなど、プロジェクト内容が分かる名前にします。
    • Description (optional): リポジトリの説明を任意で入力できます。例:「Snowpark Week66 チャレンジ解答コード」など。
    • Visibility: 「Public」(公開)か「Private」(非公開)を選択します。自分用の記録や限定共有ならPrivateでも構いませんが、広く共有したい場合はPublicにします。
  2. 初期化オプションの設定: 「Initialize this repository with a README」や「Add .gitignore」「Choose a license」といったチェックボックスがありますが、今回は特に必要ないので何もチェックせず進めます。もちろんREADMEを作成しても構いませんが、後からでも追加できます。

  3. リポジトリの作成: 必要項目を入力できたら、ページ下部のCreate repositoryボタンをクリックします。これで新しいリポジトリが作成されます。

リポジトリが作成されると、https://github.com/あなたのユーザ名/リポジトリ名 というURLでアクセスできるようになります。
5. ディレクトリの作成
 week_66を作成しましょう。他の回もやりますよね?w

次に、このリポジトリに先ほど保存したコードファイルを追加します。

コードファイルのアップロード

今回は実行コードと環境作成&確認コードの2つをアップしました。

  1. アップロード画面を開く
    GitHubの新規作成したリポジトリのページで、ファイル一覧がまだ空の状態です。**「Add file」というボタン(またはドロップダウン)があるので、そこをクリックして「Upload files」**を選択します。

  1. GitHubへのファイルアップロード
    GitHubの新規リポジトリ作成後、以下のいずれかの方法でファイルをアップロードできます

  2. 「uploading an existing file」リンクを使用

    • リポジトリ画面中央の青いリンクテキスト「uploading an existing file」をクリック
  3. ドラッグ&ドロップ

    • ファイルやフォルダを直接ブラウザ画面にドラッグ&ドロップ
  4. 「Add file」ボタンからアップロード(表示される場合)

    • 「Add file」→「Upload files」を選択

※ GitHubのUI更新により、表示方法が変更される場合があります。

  1. コミットメッセージの入力: 画面下のCommit changes欄に、今回の変更内容を示す短いコメントを入力します。例えば「Add Week 66 Snowpark solution code」といったメッセージを記載します。これはアップロードするファイルを後で振り返るための履歴コメントになります。特に規則はありませんが、わかりやすく簡潔に書きます。

  1. コミット (反映): コミットメッセージを入力したら、その下で直接mainブランチにコミットするオプションが選択されていることを確認し(デフォルトでそうなっています)、Commit changesボタンをクリックします。これでファイルがリポジトリにアップロードされ、変更が確定(コミット)されました。

  2. アップロード結果の確認: リポジトリのファイル一覧にWeek_66.pyが表示され、中身もWeb上で閲覧できるはずです。正しくコードがアップロードされたことを確認してください。必要に応じてREADMEに説明を追記したり、コードにタグを付けたりしても良いでしょう。

アップロードが完了すると、あなたのGitHubリポジトリ上で誰でも(Privateの場合は自分と招待した人だけ)そのコードを閲覧可能になります。
という訳で、これでFrosty Friday第66回の解答コードを共有できました!!(やったぜ!)

ちなみに私がアップしたソース等はこちら

https://github.com/Taro-Matsui/frosty-friday/tree/main/week066


以上、Snowparkを使ったSnowflake内でのデータ処理手順と、GitHubへのコード共有手順について詳しく説明しました。Snowparkを用いることで、Snowflake上でPythonによる柔軟なデータ操作が可能であり、SQLだけでは難しい処理も実現できます。また、演習後にGitHubにコードをアップロードすることで、社内外のコミュニティと知見を共有したり、自分の成果物を蓄積していくことができます。

SnowVillageについて

このような記事を書くきっかけとなったのは、SnowflakeのユーザーコミュニティであるSnowVillageやFrosty Fridayを運営しているコミュニティメンバーとの出会いがあったからです。

コミュニティに参加するだけで様々な知見や学びを得られますし、イベントに参加することでより実践的で深い技術やノウハウを学ぶことが出来ます。それらを通じてデータエンジニアとして成長する機会も大きく増えると思いますので、少しでも興味を持った方はぜひご参加ください。
またいきなりコミュニティに入るのは・・という方もまずはSnowVillageが運営するYoutubeチャネルでアーカイブを観たり、配信を視聴してはいかがでしょうか?最新のアップデートや技術ニュースなど様々なことを楽しく学べると思います!

SnowVillage
https://usergroups.snowflake.com/snowvillage/

SnowVillageチャネル &Frosty Friday Live Challenge
https://www.youtube.com/@DATACLOUD

イベント案内
https://techplay.jp/community_group/snowflake_users

Snowflake Data Heroes

Discussion