You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark3.2使用pyspark2pmml导出模型时报org.jpmml.sparkml.PMMLBuilder不存在错误

解决方案

1. 清理并替换正确版本的JPMML依赖

你当前下载的jpmml-sparkml-executable-1.7.2.jar适配Spark 3.1.x,jpmml-sparkml-executable-1.8.0.jar适配Spark 3.3.x,和你使用的Spark 3.2.0均不兼容,这是报错里Expected Apache Spark ML version 3.1, got version 3.2的直接原因。

  • 先删除~/.local/lib/python3.8/site-packages/pyspark/jars目录下的两个旧JAR包,避免类加载冲突
  • 下载适配Spark 3.2.x的jpmml-sparkml-executable-1.7.4.jar放入上述jars目录

2. 修改Spark初始化配置,明确指定JAR包路径

初始化SparkConf时显式指定JPMML包路径,避免Spark未自动加载JAR包:

from pyspark import SparkConf
from pyspark import SparkContext
from pyspark.sql import SparkSession
# 路径对应你的系统用户名,用绝对路径避免波浪号识别异常
conf = SparkConf().setAppName("SparkApp_ETL_ML").setMaster("local[*]")\
    .set("spark.jars", "/home/mbg/.local/lib/python3.8/site-packages/pyspark/jars/jpmml-sparkml-executable-1.7.4.jar")
sc = SparkContext.getOrCreate(conf)
spark = SparkSession.builder.getOrCreate()

3. 修正Pipeline构建逻辑,适配PMML导出要求

你当前的写法是分别对训练集、测试集fit Pipeline,既会产生数据泄露问题,也会导致导出的模型不包含完整的特征处理逻辑,PMML无法正确解析。请将随机森林也加入Pipeline的stage,一次性完成训练:

input_columns = ["x", "y", "z"]  # 待使用的输入特征列
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的stage
rf = RandomForestClassifier(featuresCol='features_norm', labelCol='label', maxDepth=20, numTrees=7, seed=1)
full_pipeline = Pipeline(stages=[indexer, vectorAssembler, normalizer, rf])
# 仅在训练集上fit一次,避免数据泄露
pipelineModel = full_pipeline.fit(train)
# 转换训练集、测试集
df_train = pipelineModel.transform(train)
df_test = pipelineModel.transform(test)
# 模型评估
binEval = MulticlassClassificationEvaluator().setMetricName("accuracy").setPredictionCol("prediction").setLabelCol("label")
print("测试集准确率:", binEval.evaluate(df_test))

# 导出PMML模型
from pyspark2pmml import PMMLBuilder
model_target = "HMP_frModel.xml" 
# 传入完整的pipelineModel,而非单独的随机森林模型
pmmlBuilder = PMMLBuilder(sc, train, pipelineModel)
pmmlBuilder.buildFile(model_target)

4. 生效配置并重启服务

  • 执行source ~/.bashrc确保环境变量生效
  • 完全关闭当前Jupyter Notebook服务,重启后重新运行代码,仅重启内核无法加载新的JAR包和环境变量
  • 可执行pip install --upgrade pyspark2pmml确保Python端依赖版本适配

内容的提问来源于stack exchange,提问作者Hassan RHANIMI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:06:01