こんにちは。ozawaです。
今日は、SnowCLIを使ってSQLクエリを叩いてみます。
SnowCLIは、ローカルPC上からコマンドベースでSnowflakeにアクセスし、クエリを叩いたりオブジェクトを作成できるライブラリとなります。
ローカルPCで動くSnowCLIを使う用途として、オンプレPCとSnowflakeの間でデータのやり取りをする場面があります。
今回は、SnowflakeからオンプレPCにデータを取り出すことを想定して、SnowCLIでSQLを叩く方法をいくつか紹介します。
※ 似たようなツールとして、SnowSQLがありますが、SnowSQLでできることは基本的にSnowCLIで再現でき、SnowCLIでは便利なコマンドがあることから、コマンドベースのツールであればSnowCLIを使うのが個人的にはいいかなと思っています。
SnowCLIを使うための前準備
次に、SnowCLIでの開発方法を紹介していきます。
とりあえず、SnowCLIをインストールしていきましょう!
# SnowCLIインストール (git bash)
python -m venv cli_env #仮想環境を作ってその中で作業する。
source cli_env/Script/activate.bat #仮想環境起動!
pip install snowflake-cli-labs #snowcliインストール
# Snowflakeへの接続設定
snow connection add #接続設定を作成
## Snowflakeのアカウントや、ユーザ名、ロールやウェアハウスが求められます。
SnowCLIでSQLを叩く
それでは、SnowCLIを使って、ローカルPCからSnowflakeへSQLを叩いてみましょう。
「snow sql」コマンドを使用することで、クエリを叩くことができます。3つほどオプションがありますので、3つの手法でクエリを叩いてみます。
1.snow sql -q <query>
<query>部分に任意のSQLクエリを入れて実行できます。
単文のSQLを叩くときは、q: クエリオプションが有効です。
//select CURRENT_DATE()を実行
$ snow sql -q 'select CURRENT_DATE()'
//実行結果
select CURRENT_DATE()
+----------------+
| CURRENT_DATE() |
|----------------|
| 2024-05-16 |
+----------------+
2.snow sql -f <filename>
SQLファイルがローカルPCにあれば、SQLファイルを指定して実行することも可能です。
特に複数文のクエリを叩きたいとき、一つのSQLファイルに複数のクエリを入れて、SQLファイルを指定して実行すると、まとめて実行できます。
まず、SQLファイルを作成します。今回は、二つのクエリを格納します。
//sample1.sql
select current_date();
select concat('today is ', current_date());
f: ファイルオプションを使用して、sample1.sqlを指定して実行します。
//二つのクエリを実行
$ snow sql -f sample1.sql
//一個目
select current_date();
+----------------+
| CURRENT_DATE() |
|----------------|
| 2024-05-16 |
+----------------+
//二個目
select concat('today is ', current_date());
+-------------------------------------+
| CONCAT('TODAY IS ', CURRENT_DATE()) |
|-------------------------------------|
| today is 2024-05-16 |
+-------------------------------------+
3.<command> | snow sql -i
コマンドにおけるパイプを使った実行も可能です。
i:stdinオプションを使用して、 <command>で出力される命令文を、後続の「snow sql」に渡して実行することができます。
//'select current_date()'をECHO(出力)して、後続のsnow sqlのクエリとして利用する。
$ echo 'select current_date()' | snow sql -i
//出力結果
select current_date()
+----------------+
| CURRENT_DATE() |
|----------------|
| 2024-05-16 |
+----------------+
トラブル:出力レコードが多いクエリは固まってしまう
例えば10000件のレコードを出力するクエリをSnowCLIで実行すると、コマンド上に10000件の表示処理が発生するため、コマンドラインが固まります。
出力レコードが多いクエリは固まらないために、工夫が必要です。
■ 回避策
ファイルへの出力パイプ「>」を使って、コマンド上に表示されるメッセージ・結果をテキストファイルに格納します。
$ snow sql -q 'select CURRENT_DATE()' > test.txt
コマンド上には何も表示されず、test.txtの中にメッセージと結果が格納されます。
//test.txt
select current_date()
+----------------+
| CURRENT_DATE() |
|----------------|
| 2024-05-16 |
+----------------+
出力パイプ「>」を使用することで、コマンドラインが固まるのを防ぎます。
おわりに
truestarでは、Snowflake導入検討、導入支援や環境構築まで幅広くサポート可能です。
Snowflakeに゙興味がある、導入済みだけどもっとうまく活用したい等々ありましたら、ぜひこちらから相談ください!
これまでのSnowflakeに関する記事はこちら