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
相关产品推荐
相关产品推荐

