Configuration d’un carnet Jupyter pour Snowpark

Cette rubrique explique comment configurer un carnet de notes Jupyter pour Snowpark.

Dans ce chapitre :

Configuration d’un carnet Jupyter pour le développement Scala

Assurez-vous que Jupyter est configuré pour utiliser Scala. Par exemple, vous pouvez installer le noyau Almond.

Note

Lorsque vous utilisez coursier pour installer le noyau Almond, spécifiez une version de Scala prise en charge.

Configuration du carnet Jupyter pour Snowpark

Ensuite, configurez le carnet Jupyter pour Snowpark.

  1. Dans une nouvelle cellule, exécutez les commandes suivantes pour configurer le carnet afin d’utiliser un référentiel Maven pour une bibliothèque dont Snowpark dépend :

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

    Note

    Ces commandes doivent être exécutées à partir d’une cellule différente de celle du reste des commandes de cette section.

  2. Dans une nouvelle cellule, exécutez les commandes suivantes pour définir une variable pour un répertoire :

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

    Cela permet de faire ce qui suit :

    • Définit une variable pour un répertoire pour les classes générées par le REPL de Scala.

    • Crée ce répertoire.

    Note

    Assurez-vous que vous avez les autorisations du système d’exploitation pour créer un répertoire à cet endroit.

    Le REPL Scala génère des classes pour le code Scala que vous écrivez, y compris votre code qui définit des UDFs. La bibliothèque Snowpark utilise ce répertoire pour trouver et charger les classes pour vos UDFs qui sont générées par le REPL.

    Note

    Si vous utilisez plusieurs ordinateurs portables, vous devrez créer et configurer un répertoire de classe REPL distinct pour chaque ordinateur portable.

  3. Exécutez les commandes suivantes dans une cellule pour configurer le compilateur pour le REPL Scala :

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

    Cela permet de faire ce qui suit :

    • Configure le compilateur pour générer des classes pour les REPL dans le répertoire que vous avez créé précédemment.

    • Configure le compilateur pour envelopper le code entré dans le REPL dans des classes, plutôt que dans des objets.

    • Ajoute le répertoire que vous avez créé précédemment comme une dépendance de l’interpréteur REPL.

  4. Créez une nouvelle session dans Snowpark, et ajoutez le répertoire de classe REPL que vous avez créé plus tôt comme dépendance. Par exemple :

    // 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)

    Voir Création d’une session pour Snowpark pour une explication des clés Map.

  5. Exécutez les commandes suivantes dans une cellule pour ajouter les classes du noyau Ammonite comme dépendances pour votre 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")
    

    Note

    Si vous prévoyez de créer des UDFs dont les dépendances sont disponibles via Maven, vous pouvez utiliser la méthode addClass définie ci-dessus pour ajouter ces dépendances :

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

    Si vous devez spécifier une dépendance dans un fichier JAR, appelez interp.load.cp pour charger le fichier JAR pour l’interpréteur REPL, et appelez session.addDependency pour ajouter le fichier JAR comme dépendance pour vos UDFs :

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

Vérification de la configuration de votre carnet Jupyter

Exécutez les commandes suivantes dans une cellule pour vérifier que vous pouvez définir et appeler une fonction anonyme définie par l’utilisateur (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()