Snowpark開発環境の設定をVisual Studio Codeで試してみた

2021.06.22

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

SnowflakeのPreview機能として、Snowparkという機能がPreview公開されています。

まだ私がSnowparkについて良く理解できていないので、まずは学習のために環境設定を試してみることにしました。

前提条件

SnowparkはPreview機能として公開されていますが、2021年06月 現在では下記の制約があります。

  • 利用できる環境はAWSにホスティングされているSnowflakeアカウント
  • 利用できる言語はScala

Snowpark is currently available for the Scala programming language for use with Snowflake accounts hosted on Amazon Web Services (AWS).

Snowparkとは?

Snowparkは先日開催された「Snowflake Summit 2021」で紹介された新しい機能です。

Snowparkを利用すると、新しい開発者エクスペリエンスとして好みの言語でワークロードをSnowflake内で直接実行できるようになります。

Visual Studio Codeで環境設定をしてみる

ということで、まずはどのような感じなのか触ってみたいので、普段利用している Visual Studio Codeで環境設定をしてみたいと思います。

設定については下記のドキュメントに記載されているので、こちらに沿ってやってみます。

拡張機能「Scala (Metals)」の導入

拡張機能は「Scala (Metals)」という拡張機能を導入します。scalameta.metalsで検索して表示される下記の拡張機能を「インストール」します。

インストール後は、下記のようにアイコンがサイドバーに表示されるようになります。

新規Scalaプロジェクトの作成

適当な新規ディレクトリを作成して、Visual Studio Codeで開きます。今回はsnowpark_projectsという名前のディレクトリを作成してみました。

作成したディレクトリをVisual Studio Codeで開いたら、Metalsのアイコンをクリックして、新規にScalaプロジェクトを作成します。

テンプレートの選択画面が表示されるので、scala/hello-world.g8を選択します。

ワークスペースディレクトリを聞かれるので、先程作成したhello_snowparkディレクトリを指定します。

プロジェクト名を聞かれるのでhello_snowparkと入力します。

しばらくすると、右下にプロジェクトを新しいウィンドウで開くかを聞かれるのでYesをクリックして開きます。

新しく開いたウィンドウで、今度はbuildをインポートするか聞かれるのでImport buildをクリックします。

これでScalaプロジェクトの準備ができました。

Snowpark用の設定

続いて、Snowpark用の設定を行います。

build.sbtファイルを開いて、scalaVersionを指定します。下記に記載があるとおり、2021年06月 現在は2.13.xはサポートされておらず、2.12.9および、それ以降の2.12.xがサポートされているそうです。

The Snowpark API is supported with Scala 2.12(specifically, version 2.12.9 and later 2.12.x versions).

2021/06/22 現在では2.12.14が最新のようなので、こちらを指定します。

build.sbt

// The simplest possible sbt build file is just one line:

scalaVersion := "2.12.14"
// That is, to create a valid sbt build, all you've got to do is define the
// version of Scala you'd like your project to use.

次に、OSGeoのリポジトリ追加と、Snowparkライブラリの依存関係追加が必要とのことなので、これも追加します。

build.sbt

// Want to use a published library in your project?
// You can define other libraries as dependencies in your build like this:

libraryDependencies += "org.scala-lang.modules" %% "scala-parser-combinators" % "1.1.2"

resolvers += "OSGeo Release Repository" at "https://repo.osgeo.org/repository/release/"
libraryDependencies += "com.snowflake" % "snowpark" % "0.6.0"

変更後にファイルを保存すると、変更インポートするか聞かれるのでImport changesをクリックして再インポートします。

これで設定完了です!

設定の確認

最後にサンプルプログラムを実行して、設定の確認をします。

Main.scalaを以下のように書き換えます。また、プレースホルダーの箇所は、実際に利用しているSnowflake環境のものに変更します。

src/main/scala/Main.scala

import com.snowflake.snowpark._
import com.snowflake.snowpark.functions._

object Main {
  def main(args: Array[String]): Unit = {
    // Replace the <placeholders> below.
    val configs = Map (
      "URL" -> "https://<account>.snowflakecomputing.com:443",
      "USER" -> "<user name>",
      "PASSWORD" -> "<password>",
      "ROLE" -> "<role name>",
      "WAREHOUSE" -> "<warehouse name>",
      "DB" -> "<database name>",
      "SCHEMA" -> "<schema name>"
    )
    val session = Session.builder.configs(configs).create
    session.sql("show tables").show()
  }
}

修正したら、エディタ上の「run」をクリックします。

無事に成功すると、show tablesコマンドの結果が返って、デバッグウィンドウに下記のように表示されると思います!

[main]  INFO (Logging.scala:22) - Closing stderr and redirecting to stdout
[main]  INFO (Logging.scala:22) - Done closing stderr and redirecting to stdout
[main]  INFO (Logging.scala:22) - Actively querying parameter snowpark_lazy_analysis from server.
[main]  INFO (Logging.scala:22) - Execute query [queryID: 019d16ad-0000-22ca-0000-00b400f4c536] show tables
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|"created_on"             |"name"     |"database_name"        |"schema_name"  |"kind"  |"comment"  |"cluster_by"  |"rows"   |"bytes"    |"owner"  |"retention_time"  |"automatic_clustering"  |"change_tracking"  |"search_optimization"  |"search_optimization_progress"  |"search_optimization_bytes"  |"is_external"  |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|2019-12-13 21:14:02.619  |CUSTOMER   |SNOWFLAKE_SAMPLE_DATA  |TPCH_SF1       |TABLE   |           |              |150000   |10777088   |         |1                 |OFF                     |OFF                |OFF                    |NULL                            |NULL                         |N              |
|2019-12-13 21:14:02.93   |JCUSTOMER  |SNOWFLAKE_SAMPLE_DATA  |TPCH_SF1       |TABLE   |           |              |150000   |10777088   |         |1                 |OFF                     |OFF                |OFF                    |NULL                            |NULL                         |N              |
|2019-12-13 21:14:11.673  |JLINEITEM  |SNOWFLAKE_SAMPLE_DATA  |TPCH_SF1       |TABLE   |           |              |6001215  |166893568  |         |1                 |OFF                     |OFF                |OFF                    |NULL                            |NULL                         |N              |
|2019-12-13 21:14:01.215  |JNATION    |SNOWFLAKE_SAMPLE_DATA  |TPCH_SF1       |TABLE   |           |              |25       |2560       |         |1                 |OFF                     |OFF                |OFF                    |NULL                            |NULL                         |N              |
|2019-12-13 21:14:09.873  |JORDERS    |SNOWFLAKE_SAMPLE_DATA  |TPCH_SF1       |TABLE   |           |              |1500000  |42665984   |         |1                 |OFF                     |OFF                |OFF                    |NULL                            |NULL                         |N              |
|2019-12-13 21:14:06.355  |JPART      |SNOWFLAKE_SAMPLE_DATA  |TPCH_SF1       |TABLE   |           |              |200000   |5214208    |         |1                 |OFF                     |OFF                |OFF                    |NULL                            |NULL                         |N              |
|2019-12-13 21:14:08.08   |JPARTSUPP  |SNOWFLAKE_SAMPLE_DATA  |TPCH_SF1       |TABLE   |           |              |800000   |36625920   |         |1                 |OFF                     |OFF                |OFF                    |NULL                            |NULL                         |N              |
|2019-12-13 21:13:59.415  |JREGION    |SNOWFLAKE_SAMPLE_DATA  |TPCH_SF1       |TABLE   |           |              |5        |1536       |         |1                 |OFF                     |OFF                |OFF                    |NULL                            |NULL                         |N              |
|2019-12-13 21:14:04.667  |JSUPPLIER  |SNOWFLAKE_SAMPLE_DATA  |TPCH_SF1       |TABLE   |           |              |10000    |684032     |         |1                 |OFF                     |OFF                |OFF                    |NULL                            |NULL                         |N              |
|2019-12-13 21:14:11.333  |LINEITEM   |SNOWFLAKE_SAMPLE_DATA  |TPCH_SF1       |TABLE   |           |              |6001215  |165127168  |         |1                 |OFF                     |OFF                |OFF                    |NULL                            |NULL                         |N              |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

これで、Visual Studio CodeでSnowparkを利用する準備ができましたね!

まとめ

以上、Snowpark開発環境の設定をVisual Studio Codeで試してみました。

公式ドキュメントにとても詳しく記載されているので、今回は特にハマることもなく設定ができました。設定ができたので、今後少しSnowparkを触って感覚を掴んでおきたいと思います。

どなたかのお役に立てば幸いです。それでは!