org.jpmml.sparkml.PMMLBuilder does not exist in the JVM

Viewed 168

Thanks a lot for any help.

My goal is to save a trained model in XML format and Im really stragling with this error and warnings

---------------------------------------------------------------------------
Exception in thread "Thread-4" java.lang.ExceptionInInitializerError
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:398)
    at py4j.reflection.CurrentThreadClassLoadingStrategy.classForName(CurrentThreadClassLoadingStrategy.java:40)
    at py4j.reflection.ReflectionUtil.classForName(ReflectionUtil.java:51)
    at py4j.reflection.TypeUtil.forName(TypeUtil.java:243)
    at py4j.commands.ReflectionCommand.getUnknownMember(ReflectionCommand.java:175)
    at py4j.commands.ReflectionCommand.execute(ReflectionCommand.java:87)
    at py4j.ClientServerConnection.waitForCommands(ClientServerConnection.java:182)
    at py4j.ClientServerConnection.run(ClientServerConnection.java:106)
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.IllegalArgumentException: Expected Apache Spark ML version 3.1, got version 3.2 (3.2.0)
    at org.jpmml.sparkml.ConverterFactory.checkVersion(ConverterFactory.java:114)
    at org.jpmml.sparkml.PMMLBuilder.init(PMMLBuilder.java:481)
    at org.jpmml.sparkml.PMMLBuilder.<clinit>(PMMLBuilder.java:545)
    ... 10 more
ERROR:root:Exception while sending command.
Traceback (most recent call last):
  File "/home/mbg/.local/lib/python3.8/site-packages/pyspark/python/lib/py4j-0.10.9.2-src.zip/py4j/clientserver.py", line 480, in send_command
    raise Py4JNetworkError("Answer from Java side is empty")
py4j.protocol.Py4JNetworkError: Answer from Java side is empty

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/mbg/.local/lib/python3.8/site-packages/pyspark/python/lib/py4j-0.10.9.2-src.zip/py4j/java_gateway.py", line 1038, in send_command
    response = connection.send_command(command)
  File "/home/mbg/.local/lib/python3.8/site-packages/pyspark/python/lib/py4j-0.10.9.2-src.zip/py4j/clientserver.py", line 503, in send_command
    raise Py4JNetworkError(
py4j.protocol.Py4JNetworkError: Error while sending or receiving
---------------------------------------------------------------------------
Py4JError                                 Traceback (most recent call last)
/tmp/ipykernel_20251/3496938591.py in <module>
----> 1 pmmlBuilder = PMMLBuilder(sc, df_train, rfModel)

~/.local/lib/python3.8/site-packages/pyspark2pmml/__init__.py in __init__(self, sc, df, pipelineModel)
     10                 javaSchema = javaDf.schema.__call__()
     11                 javaPipelineModel = pipelineModel._to_java()
---> 12                 javaPmmlBuilderClass = sc._jvm.org.jpmml.sparkml.PMMLBuilder
     13                 if(not isinstance(javaPmmlBuilderClass, JavaClass)):
     14                         raise RuntimeError("JPMML-SparkML not found on classpath")

~/.local/lib/python3.8/site-packages/pyspark/python/lib/py4j-0.10.9.2-src.zip/py4j/java_gateway.py in __getattr__(self, name)
   1647                 answer[proto.CLASS_FQN_START:], self._gateway_client)
   1648         else:
-> 1649             raise Py4JError("{0} does not exist in the JVM".format(new_fqn))
   1650 
   1651 

Py4JError: org.jpmml.sparkml.PMMLBuilder does not exist in the JVM

My code is the folowing:

from pyspark import SparkConf
from pyspark import SparkContext
from pyspark.sql import SparkSession
conf = SparkConf().setAppName("SparkApp_ETL_ML").setMaster("local[*]")
sc = SparkContext.getOrCreate(conf)
spark = SparkSession.builder.getOrCreate()

import pandas as pd
df=pd.read_parquet("https://s3.eu-de.cloud-object-storage.appdomain.cloud/cloud-object-storage-yy-cos-standard-js4/data.parquet")

sdf = spark.createDataFrame(df)

from pyspark.sql.types import DoubleType
sdf = sdf.withColumn("x", sdf.x.cast(DoubleType()))
sdf = sdf.withColumn("y", sdf.y.cast(DoubleType()))
sdf = sdf.withColumn("z", sdf.z.cast(DoubleType()))

from pyspark.ml.feature import StringIndexer
from pyspark.ml.feature import VectorAssembler
from pyspark.ml.feature import MinMaxScaler
from pyspark.ml import Pipeline
from pyspark.ml.evaluation import MulticlassClassificationEvaluator

input_columns = ["x", "y", "z"]  # input columns to consider
train, test = sdf.randomSplit([0.8, 0.2], seed=1)
indexer = StringIndexer(inputCol="class", outputCol="label")
vectorAssembler = VectorAssembler(inputCols=input_columns, outputCol="features")
normalizer = MinMaxScaler(inputCol="features", outputCol="features_norm")
pipeline = Pipeline(stages=[indexer, vectorAssembler, normalizer])
binEval = MulticlassClassificationEvaluator().setMetricName("accuracy").setPredictionCol("prediction"). \
    setLabelCol("label")
df_train = pipeline.fit(train).transform(train)
df_test = pipeline.fit(test).transform(test)

from pyspark.ml.classification import RandomForestClassifier

rf = RandomForestClassifier(featuresCol='features_norm', labelCol='label', maxDepth=20, numTrees=7, seed=1)
rfModel = rf.fit(df_train)

from pyspark2pmml import PMMLBuilder
model_target = "HMP_frModel.xml" 

pmmlBuilder = PMMLBuilder(sc, df_train, rfModel)

All works well till the last line in code.

I tried all solutions i found on the internet but unfortunatly without success.

I am working with jupyter notebook not anaconda and installed pyspark with pip and I added those variables in the .bashrc

export PATH=$PATH:~/.local/bin
export SPARK_HOME=~/.local/lib/python3.8/site-packages/pyspark
export PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.10.9.2-src.zip
export PATH=$SPARK_HOME/bin:$SPARK_HOME/python:$PATH

export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook'

I also downloaded those jar files jpmml-sparkml-executable-1.7.2.jar jpmml-sparkml-executable-1.8.0.jar and put them in this directory ~/.local/lib/python3.8/site-packages/pyspark/jars

0 Answers
Related