如何在Spark中加载.sav格式机器学习模型并解决加载报错问题
问题分析与解决方案
一、优先解决类找不到的报错
你遇到的java.lang.ClassNotFoundException: org.apache.spark.ml.Pipeline$属于运行时依赖缺失问题,按以下步骤排查修复:
- 确认项目已引入对应版本的Spark MLlib依赖:
如果是sbt项目,在build.sbt中添加:
如果是Maven项目,在libraryDependencies += "org.apache.spark" %% "spark-mllib" % "你的Spark集群对应版本" % Providedpom.xml中添加:<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-mllib_2.12</artifactId> <version>你的Spark集群对应版本</version> <scope>provided</scope> </dependency> - 确认项目依赖的Spark版本和运行环境的Spark版本完全一致,版本不匹配会直接导致类加载失败。
- 如果是在IDEA本地运行代码,需要在运行配置中勾选
Include dependencies with "Provided" scope,否则Provided级别的依赖不会被加载到运行时环境。
二、解决.sav格式模型加载问题
Spark ML原生的Pipeline和PipelineModel仅支持读取Spark本身导出的、以目录形式存储的模型文件,*.sav格式通常是scikit-learn、SPSS等其他工具导出的文件,默认无法直接读取,分两种场景处理:
场景1:该.sav是Spark ML导出的模型
如果这个模型是你之前用PipelineModel.save()方法导出的,只是人为将导出的根目录命名为了model_final.sav,那么你原来的加载代码是正确的,修复完第一步的依赖问题后即可正常加载,注意路径指向根目录即可,不要指定目录内的单个文件。
场景2:该.sav是第三方工具导出的文件
- 如果是scikit-learn导出的sav模型:可以先将模型转换为ONNX格式,再用ONNX Runtime for Spark加载运行;也可以先将模型导出为PMML格式,再用jpmml-sparkml等适配库在Spark中加载。
- 如果是SPSS导出的sav统计数据文件:你需要使用spark-sav-reader等专属数据读取依赖加载数据,不要调用
PipelineModel.load方法加载。
三、加载验证
加载成功后可以执行以下代码确认模型结构正常:
loaded_model.stages.foreach(println)
内容的提问来源于stack exchange,提问作者meher ben ahmed
相关产品推荐
相关产品推荐

