❄️

Frosty Friday Week117 Snowflake CLI

こんにちは! がく@ちゅらデータエンジニアです。

https://qiita.com/advent-calendar/2024/frostyfriday

こちらの3日目の記事になります。

Frosty Friday Week117 Basic Snowflake CLI

今回はSnowflake CLIのチャレンジです
https://frostyfriday.org/blog/2024/11/01/week-117-basic/

先日、Frosty Friday Live Challenge Vol.14 にてSnowSQLをやったのですが、その差とかなかなか面白かったですね!

今回のチャレンジの内容

やること

  1. S3から次のノートブックをダウンロードします ※s3://の記法なのでリンクは後述を使ってください
  2. Snowflake CLI をインストールします (まだインストールしていない場合)
  3. ファイル経由で接続を作成しますconfig.toml(まだ作成していない場合)
  4. ノートブック用のステージ(NOTEBOOK_STAGE)を作成する
  5. ファイルをステージにアップロードする
  6. ステージ内のファイルからノートブックを作成する
  7. CLIからノートブックを開く
  8. ノートブックを実行する

やってみよう

Notebook をダウンロードする

S3のリンクは、s3://**** のため、直接ブラウザなどでダウンロードできません。
ダウンロードできるURLに変換しましたので、こちらから取得します。

Snowflake CLI をインストールする

ドキュメントはこちら

私は、Macを使っているので、homebrewを使う方法でまずやってみたのですが、上手くインストールができませんでした・・・

brew tap snowflakedb/snowflake-cli
brew update

brew install snowflake-cli

ってやると・・・

Last 15 lines from /Users/gaku.tashiro/Library/Logs/Homebrew/snowflake-cli/03.python:
      In file included from src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.cpp:5:
      src/snowflake/connector/nanoarrow_cpp/ArrowIterator/ArrayConverter.hpp:8:10: fatal error: 'memory' file not found
          8 | #include <memory>
            |          ^~~~~~~~
      1 error generated.
      error: command '/opt/homebrew/Library/Homebrew/shims/mac/super/clang++' failed with exit code 1
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for snowflake-connector-python
Failed to build snowflake-connector-python

[notice] A new release of pip is available: 24.2 -> 24.3.1
[notice] To update, run: python -m pip install --upgrade pip
ERROR: ERROR: Failed to build installable wheels for some pyproject.toml based projects (snowflake-connector-python)

If reporting this issue please do so at (not Homebrew/brew or Homebrew/homebrew-core):
  https://github.com/snowflakedb/homebrew-snowflake-cli/issues

ってエラーが出たんですよね・・・・pipのバージョンを上げてもうまくいきませんでしたorz

で、調べていると、pipでインストールする方法があったので

pip install snowflake-cli

でインストールしました。
※ venvを使い、仮想環境にインストールする方法がおすすめされていましたが、全体で使いそうだったので、今回は(あえて)venv環境ではない全体環境(?)にインストールしました。

SnowflakeCLIのインストールが成功したかどうかは

snow --help

で確認します。

ファイル経由で接続を作成する

snowflakeCILで接続するためには、下記のコマンドを使って、接続設定を作成します。

https://docs.snowflake.com/developer-guide/snowflake-cli/connecting/connect

を参考にしました。

snow connection add

で新規作成します。

Name for this connection:(必須)(接続名)
Snowflake account name:(必須)「****.ap-northeast-1.aws」の形式のアカウントID
Snowflake username:(必須) (Snowflakeに接続するユーザ名)
Snowflake password [optional]:(オプション)パスワード認証の場合(セキュリティ上あまりおすすめしないので別認証方式使いましょう)
Role for the connection [optional]:(オプション)接続時に使うSYSADMINとか
Warehouse for the connection [optional]:(オプション)接続時に使う仮想ウェアハウス
Database for the connection [optional]:(オプション)接続するDatabase名
Schema for the connection [optional]:(オプション)接続するSchema名
Connection host [optional]:(オプション)※どういうときに使うんだろう・・・
Connection port [optional]:(オプション)※どういうときに使うんだろう・・・
Snowflake region [optional]:(オプション)※入れなくてもうまく行った
Authentication method [optional]:(オプション)
Path to private key file [optional]:(オプション)秘密鍵のファイルパス
Path to token file [optional]:(オプション)使ったことがない

※注意

  • accountは、「****.ap-northeast-1.aws」の形式のアカウントIDを記載する
    ※<organization>.<account_id>ではダメでした。
  • Authentication method
    • SNOWFLAKE_JWT : KeyPair認証の際に指定
    • externalbrowser : 外部ブラウザ認証をする(外部ブラウザが立ち上がらず認証できない事象に遭遇したが、何故か立ち上がるようになった・・・・PC再起動?うーん)
  • KeyPair認証の場合、Authentication Method は「SNOWFLAKE_JWT」を指定すべし。そして、Path to private key fileに秘密鍵ファイルパスを設定する。

※Key−Pair認証を行う場合は
https://docs.snowflake.com/ja/user-guide/key-pair-auth
を参考にしてください。

※snowflake cliの設定ファイルは

  • ~/.snowflake ディレクトリがあれば、このディレクトリに、config.toml ができます
  • 上がなければ、~/Library/Application Support/snowflake/config.toml

ノートブックのステージを作成する

今回、Stageオブジェクトを作ります。
パスは、FROSTY_FRYDAY.PUBLIC.NOTEBOOK_STAGE としています。
※Database名、Schma名は任意に設定してください

作り方は2パターンあって、

  • snowflakeCLIでSQLを実行する方法(snow sql --query)
snow sql --query "create stage NOTEBOOK_STAGE"
  • snowflakeCLIのコマンドを使う方法(snow stage create)
snow stage create @notebook_stage_2

どのオブジェクトも基本、2パターンある感じです。

ファイルをステージにアップロードする

snow stage copy frosty_nb.ipynb @frosty_friday.public.notebook_stage

このような stageへのcopyコマンドがあるので、簡単です。
subcommand:sqlならば、put コマンドを発行する感じでしょうか。

ステージ内のファイルからノートブックを作成する

こちらも2パターンやる方法があります。

  • コマンド(snow notebook create)の場合
snow notebook create -f @frosty_friday.public.notebook_stage/frosty_nb.ipynb FROSTY_NOTEBOOK
  • SQLを実行する場合、今回はSQLをファイルに書いてそちらのSQLファイルをsnow sqlで実行するパターン
CREATE NOTEBOOK FROSTY_NOTEBOOK_FROM_FILE
 FROM '@frosty_friday.public.notebook_stage'
 MAIN_FILE = 'frosty_nb.ipynb'
 QUERY_WAREHOUSE = GAKU_WH;

こんなファイルを作って

snow sql --filename 6_create_notebook.sql 

を実行すると、

CREATE NOTEBOOK FROSTY_NOTEBOOK_FROM_FILE
 FROM '@frosty_friday.public.notebook_stage'
 MAIN_FILE = 'frosty_nb.ipynb'
 QUERY_WAREHOUSE = GAKU_WH;
+----------------------------------------------------------+
| status                                                   |
|----------------------------------------------------------|
| Notebook FROSTY_NOTEBOOK_FROM_FILE successfully created. |
+----------------------------------------------------------+

CLIからノートブックを開く

snow notebook open FROSTY_NOTEBOOK

をコンソールで実行すると、ブラウザが立ち上がります

ノートブックを実行する

こちらが立ち上がるので、▶Run all で実行すると・・・・・

Hello world!

って表示されますね!

Git

https://github.com/gakut12/Frosty-Friday/tree/main/week117_basic_SnowflakeCLI

こちらで公開しております。

Snowflake CLIのインストール(アドバンス)

Snowflake CLIに自動補完をインストールするには、

snow --install-completion
zsh completion installed in <user home>/.zfunc/_snow
Completion will take effect once you restart the terminal

とした後、

snow --show-completion .zshrc

※.zshrc以外には、.bashrc, .bash_profileや他もできるようですが、試していないデス

としてあと、.zshrcへ追記して、source .zshrc として自動補完が有効にすることができます

Snowflake CLIのコマンドたち ( snow [subcommand] )

$ snow --version                                                             
Snowflake CLI version: 3.1.0

で使用しています。

  • app -- Manages a Snowflake Native App
  • connection -- Manages connections to Snowflake.
  • cortex -- Provides access to Snowflake Cortex.
  • git -- Manages git repositories in Snowflake.
  • helpers -- Helper commands.
  • init -- Creates project directory from template.
  • notebook -- Manages notebooks in Snowflake.
  • object -- Manages Snowflake objects like warehouses...
  • snowpark -- Manages procedures and functions.
  • spcs -- Manages Snowpark Container Services...
  • sql -- Executes Snowflake query.
  • stage -- Manages stages.
  • streamlit -- Manages a Streamlit app in Snowflake.

とあります。

snow sql --help

等とするとサブコマンドのhelpを見ることができます。

かなり充実したヘルプが用意されているので、わからないことがあればこちらを参考ししてみてください。

ちゅらデータ株式会社

Discussion