Python for Spark を使用したスクリプト

IBM® SPSS® Modeler は、データを処理するために Apache Spark フレームワークを使用しながら Python スクリプトを実行することができます。ここでは、付属するインターフェース用の Python API について説明します。

IBM SPSS Modeler インストールには、Spark ディストリビューションが含まれています (例えば、IBM SPSS Modeler 18.2.2 には、Spark 2.4.6 が含まれています)。

前提条件

  • Python/Spark スクリプトを IBM SPSS Analytic Server に対して実行するには、Analytic Server に接続する必要があります。また、Analytic Server が、互換性のある Apache Spark のインストール済み環境にアクセスできる状態になっている必要があります。Apache Spark を実行エンジンとして使用する方法については、IBM SPSS Analytic Server の資料を参照してください。
  • Python/Spark スクリプトを IBM SPSS Modeler Server (または Windows 64 または Mac64 を必要とする IBM SPSS Modeler クライアントに含まれるローカル サーバー) に対して実行する場合、Python をインストールしたり、その Python インストール済み環境を使用するために options.cfg を編集したりする必要はなくなりました。バージョン 18.1 以降では、IBM SPSS Modeler に Python ディストリビューションが含まれるようになりました。 ただし、デフォルトの IBM SPSS Modeler Python ディストリビューションに含まれない特定のモジュールが必要な場合は、<Modeler_installation_directory>/python に移動し、追加のパッケージをインストールできます。
    IBM SPSS Modeler に Python ディストリビューションが含まれるようになりましたが、以前のリリースと同様に、必要に応じて options.cfg に次のオプションを追加することにより、独自の Python インストール済み環境を指定できます。
    # Set to the full path to the python executable 
    (including the executable name) to enable use of PySpark.
    eas_pyspark_python_path, ""
    Windows の例:
    eas_pyspark_python_path, "C:¥¥Your_Python_Install¥¥python.exe"
    Linux の例:
    eas_pyspark_python_path, "/Your_Python_Install/bin/python"
    注: 独自の Python インストール済み環境を指定する場合、バージョン 3.7.x である必要があります。IBM SPSS Modeler は Anaconda 3 および Python 3.7.6 でテスト済みです。

IBM SPSS Analytic Server のコンテキスト オブジェクト

Python/Spark スクリプトの実行コンテキストは、Analytic Server のコンテキスト オブジェクトによって定義されます。 IBM SPSS Modeler サーバーに対して実行する場合、このコンテキスト・オブジェクトは、IBM SPSS Modeler サーバーのインストールに含まれる組み込みバージョンの Analytic Server に対応します。このコンテキスト オブジェクトを取得するには、スクリプトに以下のコードが記述されている必要があります。
import spss.pyspark.runtime
asContext = spss.pyspark.runtime.getContext()
以下のように指定すると、Analytic Server コンテキストから Spark コンテキストと SQL コンテキストを取得することができます。
sparkContext = asc.getSparkContext()
sqlContext = asc.getSparkSQLContext()

Spark コンテキストと SQL コンテキストについては、Apache Spark の資料を参照してください。

データへのアクセス

データは、Spark SQL DataFrame の形式で、Python/Spark スクリプトと実行コンテキスト間で転送されます。データを消費するスクリプト (つまり、入力ノードを除くすべてのノード) では、以下のように、コンテキストからデータ フレームを取得する必要があります。
inputData = asContext.getSparkInputData()
データを生成するスクリプト (つまり、ターミナル ノードを除くすべてのノード) では、以下のように、データ フレームをコンテキストに返す必要があります。
asContext.setSparkOutputData(outputData)
必要な場合は、以下のように SQL コンテキストを使用して、RDD から出力データ フレームを作成することができます。
outputData = sqlContext.createDataFrame(rdd)

データ モデルの定義

データを生成するノードでは、そのノードの下流で表示されるフィールドを記述するデータ モデルも定義する必要があります。Spark SQL の用語では、データ モデルはスキーマと呼ばれます。

Python/Spark スクリプトでは、pyspsark.sql.types.StructType オブジェクトの形式で出力データ モデルが定義されます。StructType は、StructField オブジェクトのリストから構成され、出力データ フレーム内の行を記述します。 それぞれの StructField により、出力データ モデル内の 1 つのフィールドが記述されます。

以下のように、入力データ フレームの :schema 属性を使用して、入力データのデータ モデルを取得することができます。
inputSchema = inputData.schema
変更されることなく受け渡しされるフィールドは、入力データ モデルから出力データ モデルにコピーすることができます。以下のように StructField コンストラクタを使用して、出力データ モデル内の新しいフィールドや変更されるフィールドを作成することができます。
field = StructField(name, dataType, nullable=True, metadata=None)

このコンストラクタについては、Spark の資料を参照してください。

少なくとも、フィールド名とそのフィールドのデータ型を指定する必要があります。必要に応じて、フィールドの尺度、役割、説明を設定するためのメタデータを指定することができます (データのメタデータを参照)。

DataModelOnly モード

下流での編集を有効にするには、特定のノードを実行する前に、そのノードの出力データ モデルを IBM SPSS Modeler に認識させる必要があります。使用可能なデータがない場合、IBM SPSS Modeler は、Python/Spark ノードの出力データ モデルを取得するために、データ モデル専用モードという特殊なモードでスクリプトを実行します。Analytic Server コンテキスト オブジェクトで isComputeDataModelOnly メソッドを使用すると、スクリプトでこの特殊なモードを識別することができます。

変換ノードのスクリプトでは、以下のような一般的なパターンを使用することができます。
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)

モデルの作成

モデルを作成するノードは、そのモデルを適切に記述する何らかのコンテンツを実行コンテキストに返す必要があります。これにより、そのモデルを適用するノードが、後でそのモデルを正確に再作成できるようになります。

モデルのコンテンツは、キーと値のペアという観点から定義されます。この場合、キーと値の意味はビルド ノードとスコア ノードでのみ認識され、Modeler がキーと値の意味を解釈することはありません。必要な場合は、ノードで MIME タイプを特定の値に割り当て、ユーザーが認識できるタイプの値を Modeler のモデル ナゲットに表示することができます。

このコンテキストの値は、PMML、HTML、画像などになります。モデル コンテンツに値を追加するには、ビルド スクリプトで以下のように指定します。
asContext.setModelContentFromString(key, value, mimeType=None)
モデル コンテンツから値を取得するには、スコア スクリプトで以下のように指定します。
value = asContext.getModelContentToString(key)
モデル全体またはモデルの一部がファイル システム内のファイルまたはフォルダに保管されている場合は、簡単な方法として、そのファイルまたはフォルダに保管されているすべてのコンテンツを 1 回の呼び出しでバンドルすることができます。これを行うには、ビルド スクリプトで以下のように指定します。
asContext.setModelContentFromPath(key, path)

この場合、MIME タイプを指定するオプションはないことに注意してください。これは、バンドルにさまざまなコンテンツ タイプが含まれている可能性があるためです。

モデルの作成時にコンテンツを保管するための一時的な場所が必要な場合は、以下のように指定すると、適切な場所をコンテキストから取得することができます
path = asContext.createTemporaryFolder()
既存のコンテンツをファイル システム内の一時的な場所に取り込むには、スコア スクリプトで以下のように指定します。
path = asContext.getModelContentToPath(key)

エラー処理

エラーを発生させるには、スクリプトから例外をスローし、その例外を IBM SPSS Modeler ユーザーに対して表示します。一部の例外については、spss.pyspark.exceptions モジュールで事前に定義されています。以下に例を示します。
from spss.pyspark.exceptions import ASContextException
if ... some error condition ...:
     raise ASContextException("message to display to user")