Snowpark用Jupyterノートブックの設定

このトピックでは、Snowpark用にJupyterノートブックを設定する方法について説明します。

このトピックの内容:

Scala開発用Jupyterノートブックの設定

JupyterでScalaを使用するように設定されていることを確認します。たとえば、 Almondカーネル をインストールできます。

注釈

coursier を使用してAlmondカーネルをインストールする場合は、 サポートされているバージョンのScala を指定します。

Snowpark用Jupyterノートブックの構成

次に、Snowpark用Jupyterノートブックを構成します。

  1. 新しいセルで次のコマンドを実行して、Snowparkが依存するライブラリのMavenリポジトリを使用するようにノートブックを構成します。

    import sys.process._
    val osgeoRepo = coursierapi.MavenRepository.of("https://repo.osgeo.org/repository/release")
    interp.repositories() ++= Seq(osgeoRepo)
    

    注釈

    これらのコマンドは、このセクションの他のコマンドとは異なるセルから実行する必要があります。

  2. 新しいセルで次のコマンドを実行して、ディレクトリの変数を定義します。

    import sys.process._
    val replClassPath = "<path_to_a_new_directory>" // e.g. /home/myusername/replClasses
    s"mkdir -p $replClassPath" !
    

    これにより、次が実行されます。

    • Scala REPL によって生成されたクラスのディレクトリの変数を定義します。

    • そのディレクトリを作成します。

    注釈

    その場所にディレクトリを作成するための、オペレーティングシステムのアクセス許可があることを確認します。

    Scala REPL は、 UDFs を定義するコードを含め、作成するScalaコードのクラスを生成します。Snowparkライブラリは、このディレクトリを使用して、 REPL によって生成された UDFs のクラスを検索してアップロードします。

    注釈

    複数のノートブックを使用している場合は、ノートブックごとに個別の REPL クラスディレクトリを作成して構成する必要があります。

  3. セルで次のコマンドを実行して、Scala REPL 用のコンパイラを構成します。

    interp.configureCompiler(_.settings.outputDirs.setSingleOutput(replClassPath))
    interp.configureCompiler(_.settings.Yreplclassbased)
    interp.load.cp(os.Path(replClassPath))
    

    これにより、次が実行されます。

    • 以前に作成したディレクトリに REPL のクラスを生成するようにコンパイラを構成します。

    • REPL に入力されたコードをオブジェクトではなく、クラスにラップするようにコンパイラを構成します。

    • 以前に作成したディレクトリを REPL インタープリターの依存関係として追加します。

  4. Snowparkで新しいセッションを作成 し、以前に作成した REPL クラスディレクトリを依存関係として追加します。例:

    // Import the Snowpark library from Maven.
    import $ivy.`com.snowflake:snowpark:0.8.0`
    
    import com.snowflake.snowpark._
    import com.snowflake.snowpark.functions._
    
    val session = Session.builder.configs(Map(
        "URL" -> "https://<account_identifier>.snowflakecomputing.com",
        "USER" -> "<username>",
        "PASSWORD" -> "<password>",
        "ROLE" -> "<role_name>",
        "WAREHOUSE" -> "<warehouse_name>",
        "DB" -> "<database_name>",
        "SCHEMA" -> "<schema_name>"
    )).create
    
    // Add the directory for REPL classes that you created earlier.
    session.addDependency(replClassPath)

    Map キーの説明については、 Snowparkのセッションの作成 をご参照ください。

  5. セルで次のコマンドを実行して、Ammoniteカーネルクラスを UDF の依存関係 として追加します。

    def addClass(session: Session, className: String): String = {
      var cls1 = Class.forName(className)
      val resourceName = "/" + cls1.getName().replace(".", "/") + ".class"
      val url = cls1.getResource(resourceName)
      val path = url.getPath().split(":").last.split("!").head
      session.addDependency(path)
      path
    }
    addClass(session, "ammonite.repl.ReplBridge$")
    addClass(session, "ammonite.interp.api.APIHolder")
    addClass(session, "pprint.TPrintColors")
    

    注釈

    Mavenを介して利用できる依存関係を持つ UDFs を作成する場合は、上記で定義した addClass メソッドを使用して、これらの依存関係を追加できます。

    addClass(session, "<dependency_package>.<dependency_class>")
    

    JAR ファイルに依存関係を指定する必要がある場合は、 interp.load.cp を呼び出して REPL インタープリターの JAR ファイルをロードし、 session.addDependency を呼び出して JAR ファイルを UDFs の依存関係として追加します。

    interp.load.cp(os.Path(<path to jar file>/<jar file>)
    addDependency(<path to jar file>/<jar file>)
    

Jupyterノートブックの構成の確認

セルで次のコマンドを実行して、匿名のユーザー定義関数(UDF)を定義して呼び出すことができることを確認します。

class UDFCode extends Serializable {
  val appendLastNameFunc = (s: String) => {
    s"$s Johnson"
  }
}
// Define an anonymous UDF.
val appendLastNameUdf = udf((new UDFCode).appendLastNameFunc)
// Create a DataFrame that has a column NAME with a single row with the value "Raymond".
val df = session.sql("select 'Raymond' NAME")
// Call the UDF, passing in the values in the NAME column.
// Return a new DataFrame that has an additional column "Full Name" that contains the value returned by the UDF.
df.withColumn("Full Name", appendLastNameUdf(col("NAME"))).show()