【Snowflake】SnowSQLを利用した複数CSVファイルのエクスポート方法

分析

分析・集計業務では、報告書やレポートを作成するために、各種集計や検証結果をCSVファイルとしてエクスポートできると便利です。

SnowflakeでCSVファイルをエクスポートする方法としては、WebUIを使う方法と、SnowSQLを使う方法の2つが存在します。

手軽なのはWebUIを使う方法ですが、ファイルを1つづ手動でダウンロードする必要やファイル名の指定ができないため、ファイル数が多かったり、何度もエクスポートを実行するケースには適していません。

一方、SnowSQLを使う方法は、慣れるまで時間がかかりますが、出力ファイル名やフォルダを指定できるし、ファイルを一度に複数ダウンロードできたりと便利です。

この記事では、SnowflakeのWebUIとSnowSQLを使って、CSVファイルを出力する方法を説明します。

WebUIを利用したCSVファイルの出力方法

まず、WebUIを利用したCSVファイルの出力方法を説明します。

WebUIを利用したCSVファイルの出力は、SQLの実行結果が表示された画面より「ダウンロードボタン」を押下することで実現できます。

上記、ダウンロードボタンを押下すると、「.csvとしてダウンロード」、「Excelの.csvとしてダウンロード」、「.tsvとしてダウンロード」の3択が表示されますので、「.csvファイルとしてダウンロード」を押下します。

押下後、ダウンロードが自動的に始まります。ファイル名は指摘できず、ダウンロード場所もブラウザの標準フォルダとなります。

この方法はファイル数が少なければ良いですが、出力ファイル数が多いケースでは、手作業でダウンロードボタンを何度も押下する必要があったり、ファイル名も指定できずファイル名からファイルの中身を推測できず、使い勝手が悪いです。

SnowSQLを利用したCSVファイルの出力方法

一度に複数のCSVファイルを出力場所やファイル名を指定してエクスポートするには、SnowSQLを使う必要があります。

SnowSQLは、Windowsのコマンドプロンプトから起動し、Snowflakeを操作するツールです。CLIクライアント(コマンド・ライン・インターフェース)とも呼ばれています。

SnowSQLを利用したCSVファイルの出力には2つの手順が必要です。

  • ①内部ステージにCSVファイルを出力
  • ②PCからSnowSQLを利用してCSVを取得

①の「内部ステージにCSVファイルを出力」は、Snowflake上で実施、②の「PCからSnowSQLを利用してCSVを取得」は、クライアントPCからSnowSQLを使って実施します。

内部ステージとは、Snowflakeの内部にあるファイルを入出力するエリアのことです。

対となる言葉として、外部ステージがあります。こちらは、S3、GoogleCloudStarge等の外部クラウドサービスのことを指し、クラウドサービス経緯でファイルの入出力を行うエリアですが、今回は利用しません。

以下、各処理の詳細を説明します。

①内部ステージにCSVファイルを出力

Snowflakeより内部ステージへCSVファイルを出力するには、COPY INTO 句を使います。構文は以下となります。

COPY INTO @~/【出力ファイル】 from (【テーブル】) 【パラメーター】;

【ファイル出力先】は、英語で指定するのが無難です。※Snowflakeの扱う文字コードがUTF-8なので、Windowsと文字コードが一致せず、日本語を使うと予期せぬ動きとなる可能性があります。

【テーブル】は、出力したいテーブルの名称を指定します。データの一部を抽出したい場合は、select文を記載することも可能です。テーブル名の指定には、ひとつ問題があって、Snowflakeでは行の出力順が決まっておらず、テーブル名称を指定しただけでは出力される行の順番が保障されないということです。指定した順番で出力したい場合、【テーブル】部分をSelect文で記載し Order by句を指定する必要があります。

【パラメータ】は、ヘッダーの有無やファイルタイプ、圧縮指定、上書き指定等のパラメータを設定します。とりあえず意味は分からなくてもよく、後述するサンプルコードのコピペで問題ありません。

以下 テーブル”TEST”からCSVファイル「OUTPUT.csv」を出力するコマンドのサンプルコードになります。

COPY INTO @~/OUTPUT.csv from (select * from "TEST" ) 
HEADER=true FILE_FORMAT=(type = 'CSV' FIELD_DELIMITER = ',' 
COMPRESSION=NONE FIELD_OPTIONALLY_ENCLOSED_BY='"'  NULL_IF='') OVERWRITE = TRUE SINGLE = TRUE;

上記を実行すると、CSVファイルが内部ステージに格納されます。

②PCからSnowSQLを利用してCSVを取得

内部ステージにファイルが格納された語は、クライアントPCのコマンドプロンプトを立ち上げて、SnowSQLを起動します。

snowsqlのログインコマンドは以下ですが、環境によって指定パラメータが異なるので、会社で利用している場合はSEさんに質問するのが良いでしょう。

$ snowsql -a <アカウント名> -u <ユーザ名> -w <仮想ウェアハウス名>

パスワード入力が成功すると、以下のような表示となります。

XXXXXXXXXXXX@(no database).(no schema)>

今回は内部ストレージからCSVファイルのダウンロードをするため、get コマンドを使用します。get コマンドの構文は以下の通り。

get 【内部ストレージ】 【保存先】 PATTERN=’【ファイル名】’;

【内部ストレージ】は、ファイルを取得する場所を指定します。今回のケースでは「@~」です。

【保存先】は、クライアントPCの特定のフォルダを指定します。Cドライブ直下のXXXXというフォルダを指定したい場合は次のように記述します。「file://c:/XXXX」

【ファイル名】は、ファイル名を指定しても良いですし、複数のファイルをダウンロードしたい場合は、正規表現の「.*」(ドットアアスタリスク)を使うこともできます。

例えば PATTERN=’OUT.*’ とした場合は、ファイル名がOUTで始まるファイルをすべてダウンロードします。

Cドライブのフォルダ「test」にOUTPUT.CSVをダウンロードするケースのサンプルコードは以下になります。

get @~  file://c:/test  PATTERN='OUTPUT.CSV';

上記実行後、対象フォルダにCSVファイルがダウンロードできていることを確認ください。

注意点

SnowSQLを使った方法にはいくつか注意点があります。

まず、COPY INTO 句は ストアドプロシージャーの内部では実行できません。データ加工からCSV出力までを関数かできないのは残念ですが、仕様なのであきらめましょう。

次に、SnowSqlで出力したファイルのエンコードはUTF-8ですので、日本語のデータがあるとExcel等で読みこんだ時に文字化けします。文字化けを回避したい場合は、エディタで文字コードの変換やExcelで読み込む際にエンコード指定を行う必要があります。

最後は、SnowSQLを使う場合、アプリケーションのインストールが必要とういことです。会社支給のPCで権限がなくアプリケーションのインストールができない場合は、SnowSQLを使うことができませんのでご注意ください。

まとめ

SnowflakeからSnowSqlを使用してCSVファイルをエクスポートする方法を説明しました。

自分自身がSnowSQLを使ったCSVのダウンロード方法の習得に苦労したので、記事にしてみました。

最初は、内部ステージという概念の理解やSnowSQLの使用方法の理解が大変ですが、定期的に分析・集計結果を出力する業務において、SnowSQLはとても役立ちます。

この記事を参考にして、SnowSQLを活用いただけると嬉しいです。

コメント

タイトルとURLをコピーしました