Scripts con Python para Spark

IBM® SPSS Modeler puede ejecutar scripts Python utilizando la infraestructura Apache Spark para procesar datos. Esta documentación proporciona la descripción de la API Python para las interfaces proporcionadas.

La instalación de IBM SPSS Modeler incluye una distribución Spark (por ejemplo, IBM SPSS Modeler 18.3 incluye Spark 2.4.6).

Requisitos previos

  • Si tiene previsto ejecutar scripts Python/Spark en IBM SPSS Analytic Server, debe tener una conexión con el Analytic Server, y el Analytic Server debe tener acceso a una instalación compatible de Apache Spark. Consulte la documentación de IBM SPSS Analytic Server si desea detalles sobre cómo utilizar Apache Spark como el motor de ejecución.
  • Si piensa ejecutar scripts Python/Spark para IBM SPSS Modeler Server (o el servidor local incluido con IBM SPSS Modeler Client, que requiere Windows 64 o Mac64), ya no necesita instalar Python ni editar el archivo options.cfg to para utilizar la instalación de Python. Ahora, a partir de la versión 18.1, IBM SPSS Modeler incluye una distribución de Python. Sin embargo, si requiere un determinado módulo que no está incluido con la distribución Python de IBM SPSS Modeler predeterminada, puede ir a <directorio_instalación_Modeler>/python e instalar paquetes adicionales.
    Aunque ahora se incluye una distribución de Python con IBM SPSS Modeler, si lo desea todavía puede hacer referencia a su propia instalación de Python como en releases anteriores, añadiendo la siguiente opción en el archivo options.cfg:
    # Establecer la vía de acceso completa en el ejecutable de python 
    (incluyendo el nombre del ejecutable) para habilitar el uso de PySpark.
    eas_pyspark_python_path, ""
    Ejemplo de Windows:
    eas_pyspark_python_path, "C:\\Your_Python_Install\\python.exe"
    Ejemplo de Linux:
    eas_pyspark_python_path, "/Your_Python_Install/bin/python"
    Nota: Si apunta a su propia instalación de Python, debe ser de la versión 3.7.x. IBM SPSS Modeler se ha probado con Anaconda 3 y Python 3.7.6.

El objeto de contexto de IBM SPSS Analytic Server.

El contexto de ejecución para un script Python/Spark se define mediante un objeto de contexto de Analytic Server. Al ejecutar en el servidor IBM SPSS Modeler, el objeto de contexto es para la versión incluida del Analytic Server que está incluido con la instalación del servidor IBM SPSS Modeler. Para obtener el objeto de contexto, el script debe incluir lo siguiente:
import spss.pyspark.runtime
asContext = spss.pyspark.runtime.getContext()
Desde el contexto de Analytic Server, puede obtener el contexto de Spark y el contexto de SQL:
sparkContext =
asc.getSparkContext()
sqlContext = asc.getSparkSQLContext()

Consulte la documentación de Apache Spark si desea información sobre el contexto de Spark y el contexto de SQL.

Acceso a los datos

Los datos se transfieren entre el script Python/Spark y el contexto de ejecución en forma de un marco de datos Spark SQL. Un script que consume datos (es decir, cualquier nodo excepto un nodo de origen) debe recuperar el marco de datos del contexto.
inputData = asContext.getSparkInputData()
Un script que genera datos (es decir, cualquier nodo excepto un nodo de terminal) debe devolver un marco de datos al contexto.
asContext.setSparkOutputData(outputData)
Puede utilizar el contexto de SQL para crear un marco de datos de salida a partir de un RDD, cuando sea necesario:
outputData = sqlContext.createDataFrame(rdd)

Definición del modelo de datos

Un nodo que genera datos también debe definir un modelo de datos que describe los campos visibles en sentido descendente del nodo. En la terminología de Spark SQL, el modelo de datos es el esquema.

Un script Python/Spark define su modelo de datos de salida en forma de un objeto pyspsark.sql.types.StructType. Un StructType describe una fila en el marco de datos de salida y se construye a partir de una lista de objetos StructField. Cada StructField describe un único campo en el modelo de datos de salida.

Puede obtener el modelo de datos para los datos de entrada utilizando el atributo :schema del marco de datos de entrada:
inputSchema = inputData.schema
Los campos que se pasan sin experimentar cambios se pueden copiar del modelo de datos de entrada al modelo de datos de salida. Los campos que son nuevos o modificados en el modelo de datos de salida se pueden crear utilizando el constructor StructField:
field = StructField(name, dataType, nullable=True, metadata=None)

Consulte la documentación de Spark si desea información sobre el constructor.

Debe proporcionar al menos el nombre del campo y su tipo de datos. De forma opcional, puede especificar metadatos para proporcionar una medida, un rol y una descripción para el campo (consulte Metadatos de datos).

Modalidad DataModelOnly

IBM SPSS Modeler necesita conocer el modelo de datos de salida para un nodo, antes de que se ejecute el nodo, para poder habilitar la edición en sentido descendente. Para obtener el modelo de datos de salida para un nodo Python/Spark, IBM SPSS Modeler ejecuta el script en una modalidad especial de "solo modelo de datos" donde no hay ningún dato disponible. El script puede identificar esta modalidad utilizando el método isComputeDataModelOnly en el objeto de contexto de Analytic Server.

El script para un nodo de transformación puede seguir este patrón general:
if asContext.isComputeDataModelOnly():   
        inputSchema = asContext.getSparkInputSchema()   
        outputSchema = ... # construir el modelo de datos de salida   
        asContext.setSparkOutputSchema(outputSchema)
else:   
        inputData = asContext.getSparkInputData()   
        outputData = ... # construir el marco de datos de salida    
        asContext.setSparkOutputData(outputData)

Generación de un modelo

Un nodo que genera un modelo debe devolver al contexto de ejecución algo de contenido que describa el modelo de forma suficiente para que el nodo que aplica el modelo pueda recrearlo exactamente más tarde.

El contenido del modelo se define en términos de pares de clave/valor donde el significado de las claves y los valores se solo es conocido para los nodos de generación y puntuación y no es interpretado por el Modeler en modo alguno. De forma opcional, el nodo puede asignar un tipo MIME a un valor con la intención de que Modeler pueda mostrar estos valores que tienen tipos conocidos por el usuario en el nugget del modelo.

Un valor en este contexto puede ser PMML, HTML, una imagen, etc. Para añadir un valor al contenido del modelo (en el script de generación):
asContext.setModelContentFromString(key,
value, mimeType=None)
Para recuperar un valor del contenido del modelo (en el script de puntuación):
value = asContext.getModelContentToString(key)
Como acceso directo, donde un modelo o una parte de un modelo está almacenado en un archivo o una carpeta en el sistema de archivos, puede empaquetar todo el contenido almacenado en dicha ubicación en una llamada (en el script de generación):
asContext.setModelContentFromPath(clave,
vía de acceso)

Tenga en cuenta que en este caso no hay ninguna opción para especificar un tipo MIME porque el paquete puede contener distintos tipos de contenido.

Si necesita una ubicación temporal para almacenar el contenido mientras se genera el modelo, puede obtener una ubicación apropiada del contexto:
path =
asContext.createTemporaryFolder()
Para recuperar contenido existente en una ubicación temporal del sistema de archivos (en el script de puntuación):
path =
asContext.getModelContentToPath(clave)

Manejo de errores

Para arrojar errores, lance una excepción desde el script y muéstrelo al usuario de IBM SPSS Modeler. Algunas excepciones están predefinidas en el módulo spss.pyspark.exceptions. Por ejemplo:
from spss.pyspark.exceptions import
ASContextException
if ... some error condition ...:
     raise ASContextException("mensaje para mostrar al usuario")