Scriptage avec Python for Spark

SPSS Modeler peut exécuter des scripts Python à l'aide de l'infrastructure Apache Spark pour traiter les données. Cette documentation fournit la description de l'API Python pour les interfaces fournies.

L'installation de SPSS Modeler inclut une distribution Spark.

Accès aux données

Les données sont transférées entre un script Python/Spark et le contexte d'exécution sous la forme d'un DataFrame Spark SQL. Un script qui consomme des données (c'est-à-dire tout noeud à l'exception d'un noeud Importation) doit extraire le DataFrame du contexte :
inputData = asContext.getSparkInputData()
Un script qui produit des données (c'est-à-dire tout noeud à l'exception d'un noeud terminal) doit retourner un DataFrame au contexte :
asContext.setSparkOutputData(outputData)
Vous pouvez utiliser le contexte SQL pour créer un DataFrame de sortie à partir d'un RDD lorsque cela est nécessaire :
outputData = sqlContext.createDataFrame(rdd)

Définition du modèle de données

Un noeud qui produit des données doit également définir un modèle de données décrivant les champs qui seront visibles en aval de lui-même. Dans la terminologie Spark SQL, le modèle de données est le schéma.

Un script Python/Spark définit son modèle de données de sortie sous la forme d'un objet pyspsark.sql.types.StructType. Un StructType décrit une ligne du DataFrame de sortie et est construit à partir d'une liste d'objets StructField. Chaque StructField décrit un champ spécifique du modèle de données de sortie.

Vous pouvez obtenir le modèle de données des données d'entrée à l'aide de l'attribut :schema du DataFrame d'entrée :
inputSchema = inputData.schema
Les champs qui sont transmis inchangés peuvent être copiés du modèle de données d'entrée dans le modèle de données de sortie. Les champs qui sont nouveaux ou modifiés dans le modèle de données de sortie peuvent être créés à l'aide du constructeur StructField :
field = StructField(name, dataType, nullable=True, metadata=None)

Pour plus d'informations sur le constructeur, reportez-vous à la documentation Spark.

Vous devez indiquer au moins le nom de champ et son type de données. Vous pouvez éventuellement spécifier des métadonnées pour fournir une mesure, un rôle et une description pour la zone (voir Métadonnées de données).

Mode DataModelOnly

SPSS Modeler doit connaître le modèle de données de sortie d'un noeud avant son exécution pour permettre l'édition en aval. Pour obtenir le modèle de données de sortie pour un noeud Python/Spark, SPSS Modeler exécute le script dans un mode modèle de données uniquement spécial où aucune donnée n'est disponible. Le script peut identifier ce mode en utilisant la méthode isComputeDataModelOnly sur l'objet contexte d'Analytic Server.

Le script d'un noeud de transformation peut suivre le modèle général suivant :
if asContext.isComputeDataModelOnly():   
        inputSchema = asContext.getSparkInputSchema()   
        outputSchema = ... # construct the output data model   
        asContext.setSparkOutputSchema(outputSchema)
else:   
        inputData = asContext.getSparkInputData()   
        outputData = ... # construct the output data frame    
        asContext.setSparkOutputData(outputData)

Construction d'un modèle

Un noeud qui construit un modèle doit renvoyer au contexte d'exécution un contenu décrivant suffisamment le modèle pour que le noeud qui applique le modèle puisse le recréer à l'identique ultérieurement.

Le contenu du modèle est défini en termes de paires clé / valeur où la signification des clés et des valeurs est connue uniquement des noeuds de génération et de score et n'est pas interprétée par SPSS Modeler de quelque manière que ce soit. Le noeud peut éventuellement affecter un type MIME à une valeur avec l'intention que SPSS Modeler affiche les valeurs dont les types sont connus de l'utilisateur dans le nugget de modèle.

Une valeur dans ce contexte peut être PMML, HTML, une image, etc. Pour ajouter une valeur au contenu du modèle (dans le script de génération):
asContext.setModelContentFromString(key, value, mimeType=None)
Pour extraire une valeur du contenu de modèle (dans le script de score) :
value = asContext.getModelContentToString(key)
En guise de raccourci, lorsqu'un modèle ou une partie d'un modèle est stocké dans un fichier ou un dossier du système de fichiers, vous pouvez regrouper tous les contenus stockés dans cet emplacement en un seul appel (dans le script de construction) :
asContext.setModelContentFromPath(key, path)

Notez que dans ce cas, il n'est pas possible de spécifier un type MIME car le regroupement peut contenir plusieurs types de contenus.

Si vous avez besoin d'un emplacement temporaire pour stocker le contenu pendant la création du modèle, vous pouvez l'obtenir du contexte :
path = asContext.createTemporaryFolder()
Pour extraire le contenu existant vers un emplacement temporaire du système de fichiers (dans le script de score) :
path = asContext.getModelContentToPath(key)

Traitement des erreurs

Pour générer des erreurs, émettez une exception à partir du script et affichez-la pour l'utilisateur SPSS Modeler . Certaines exceptions sont prédéfinies dans le module spss.pyspark.exceptions. Par exemple :
from spss.pyspark.exceptions import ASContextException
if ... some error condition ...:
     raise ASContextException("message to display to user")