見出し画像

Snowflakeさわってみた。 Native Apps Framework試してみた。

分析屋の下滝です。

Snowflakeをさわってみよう、の13回目です。

6月にプレビューになったNative Apps Frameworkがどんな概念なのかちょっと試してみました。

Native Apps Frameworkを使用すると、Snowflakeのコア機能を活用したデータアプリケーションを作成できます。Native Apps Frameworkを使用すると、次のことが可能になります:
・データや関連するビジネスロジックを他のSnowflakeアカウントと共有することで、他のSnowflake機能の機能を拡張できます。ビジネスロジックには、Streamlitアプリ、ストアドプロシージャ、およびSnowpark API、Javascript、SQLを使用して記述された関数を含めることができます。
・リスティングを通じてコンシューマーとアプリケーションを共有します。リスティングは無料または有料です。Snowflake Marketplaceでアプリを配布して収益化することも、プライベートリスティングを使用して特定の消費者に配布することもできます。
・Streamlit を使用して、リッチなビジュアライゼーションを備えたアプリを作成します。

https://docs.snowflake.com/en/developer-guide/native-apps/native-apps-about

アプリってなんじゃい、と思いそうですが、Streamlit を使ってsnowflake内にアプリを配布できるのが特に特徴かなと解釈しています。

Streamlitは、PythonだけでWebアプリを作れるフレームワークです。Djangoなどとは違って、Python(とデータ)だけで完結します。

snowflake内にStreamlitを使用したアプリ、というのも概念としてはよくわからないと思いますので、まずは、チュートリアルの完成の画面を先に共有します。

下記の画面では、アプリメニューに「HELLO_SNOWFLAKE_APP」というアプリがインストールされていることがわかります。

アプリをクリックして、上部のメニューの「HELLO_SNOWFLAKE_STREAMLIT」をクリックするとStreamlit の実行画面に移ります。

この例では、データを表示しているだけでインタラクティブな機能は実装していないですが、実装すれば可能です。

以上からわかるように、snowflake内で動作するようなアプリを開発し、snowflakeの他のユーザーに共有することができます。

今回の記事では、チュートリアルの最初の部分を解説します。Streamlitの機能も含まず、アプリを開発してインストールするところまでを簡潔に解説したいと思います。まずは、Native Apps Frameworkの概念をわかってみようというのが趣旨です。

Native Apps Framework

Native Apps Frameworkでは、アプリケーションパッケージという概念で、アプリケーションのもととなるものを作ります。

チュートリアルにあるわけではありませんが、下記の図のようなイメージです。開発者(プロバイダー)はアプリケーションパッケージを作って、アプリケーションパッケージを利用者(コンシューマ)に共有し、利用者は、アプリケーションパッケージをもとにアプリケーションをインストールします。

必要なファイルを作っていきます。上記の図でいうところの名前付きステージに後ほど格納していくファイルです。

今回は以下のようなフォルダ構成になります。ローカル環境で、tutorialフォルダ以下にファイルを作成してください。これらのファイルは後に、snowlfakeにアップロード(名前付きステージにアップロード)します。

/tutorial
 manifest.yml
 readme.md
 /scripts/
  setup.sql

manifest.ymlは必須のファイルです。

manifest_version: 1
artifacts:
  setup_script: scripts/setup.sql
  readme: readme.md

setup.sqlファイルとreadme.mdファイルが存在することを指定しています。

readme.mdはオプションです。

This is the readme file for the Hello Snowflake Application!

setup.sqlは以下です。

CREATE APPLICATION ROLE app_public;
CREATE SCHEMA IF NOT EXISTS core;
GRANT USAGE ON SCHEMA core TO APPLICATION ROLE app_public;

CREATE OR REPLACE PROCEDURE CORE.HELLO()
    RETURNS STRING
    LANGUAGE SQL
    EXECUTE AS OWNER
    AS
    BEGIN
    RETURN 'Hello Snowflake!';
    END;

GRANT USAGE ON PROCEDURE core.hello() TO APPLICATION ROLE app_public;

アプリケーションがインストールされるとき、これらのsqlが実行されます。説明に関しては公式から引用します。

インストール時にセットアップスクリプトを実行すると、app_publicという名前のアプリケーションロールが作成されます。アプリケーション・ロールはデータベース・ロールに似ていますが、アプリケーションのコンテキスト内でのみ使用できます。アプリケーション内のオブジェクトへのアクセスを許可するために使用されます。
この例では、ストアドプロシジャを格納するスキーマも作成し、スキーマ上のUSAGE権限をアプリケーションロールに付与しています。アプリケーションロールを作成し、スキーマなどのオブジェクトに対する権限をアプリケーションロールに付与することは、セットアップスクリプト内でよく使用されるパターンです。

https://docs.snowflake.com/en/developer-guide/native-apps/tutorials/getting-started-tutorial#add-application-logic-and-install-your-first-application

プロシージャも作成していますが、単に'Hello Snowflake!'を出力するだけのものです。

アプリケーションパッケージの作成

続いて、アプリケーションパッケージを作っていきます。

アプリケーションパッケージは、 アプリケーションに関する追加情報を含むように拡張された Snowflake データベースです(チュートリアルより)。

アプリケーションパッケージはCREATE APPLICATION PACKAGEを使って作ります。

GRANT CREATE APPLICATION PACKAGE ON ACCOUNT TO ROLE accountadmin;

CREATE APPLICATION PACKAGE hello_package;

ここでは、hello_packageというアプリケーションパッケージを作成しています。

画面上でも、Appメニューからパッケージが確認できます。

データベースのメニューからも確認できます。

続いて、アプリケーションパッケージの中身をいれるために名前付きステージを作成しています。ステージに入れるのは先程作成したファイル群です。

USE APPLICATION PACKAGE hello_package;

CREATE SCHEMA stage_content;

CREATE OR REPLACE STAGE hello_package.stage_content.hello_stage
  FILE_FORMAT = (TYPE = 'csv' FIELD_DELIMITER = '|' SKIP_HEADER = 1);

アプリケーションパッケージ内にステージが作成されました。

なお、ここでは、アプリケーションパッケージ内に名前付きステージを作成していますが、これは必須ではありません。アプリケーションパッケージ外にあるデータベースとスキーマ内の名前付きステージを使ってもかまいません。

続いてステージにファイルをアップロードしていきます。コマンドラインでやる方法もありますが、UI画面から行います。

ステージを選んで、右上の「+Files」ボタンを押すとアプロードできるようになりますので、アップロードしていきます。

次のようにアップロードしました。

アプリケーションのインストール

次にアプリケーションパッケージからアプリケーションをインストールします。

CREATE APPLICATION HELLO_APP
  FROM APPLICATION PACKAGE HELLO_PACKAGE
  USING '@hello_package.stage_content.hello_stage';

HELLO_APPというアプリケーションを、
HELLO_PACKAGEというアプリケーションパッケージをもとに、@hello_package.stage_content.hello_stageという名前付きステージを使って作成しています。

データベースメニュー上で、setup.sqlにもとづいて作られたアプリケーションが確認できます。

Appメニューからも確認できます。

setup.sqlで定義したプロシージャを呼ぶことができます。

おわり

今回はここまでです。チュートリアルの半分くらいまでの内容でした。チュートリアルの残りでは
・アプリケーションパッケージ内にアプリ内で共有されるデータベースを作成する方法
・UDF(ユーザー定義関数)としてPythonコードを作成する方法、外部ファイルとしてPythonモジュールを作成する方法(名前付きステージに格納)
・Streamlitを使えるように作成する方法
・組織内や組織外でアプリケーションをインストールする方法
が書かれていますので、続きはそちらを参照してください。もしかすると続きの記事も書くかもしれません。

株式会社分析屋について

ホームページはこちら。

noteでの会社紹介記事はこちら。

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!
【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。
【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。
【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。
【SES】
SESサービスも行っております。

この記事が参加している募集

やってみた