如何在AWS EMR的PySpark会话classpath中添加JPMML依赖且不改其他配置
解决方案
方案1:初始化SparkSession时动态追加依赖(不覆盖原有配置)
创建SparkSession时仅追加JPMML-SparkML的Maven依赖坐标,不会修改其他已有配置,也不影响sc.install_pypi_package功能的正常使用:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("PySpark2PMMLTest") \ # 仅追加JPMML依赖,原有配置保留 .config("spark.jars.packages", "org.jpmml:jpmml-sparkml:2.1.0") \ .getOrCreate() sc = spark.sparkContext
注:版本号需要和你的Spark版本匹配:
- Spark 2.4.x 对应 jpmml-sparkml 1.5.x
- Spark 3.0~3.2.x 对应 jpmml-sparkml 1.7.x
- Spark 3.3+ 对应 jpmml-sparkml 2.1.x
如果你的EMR集群无法访问公网Maven仓库,可以提前下载对应版本的JPMML-SparkML JAR包上传到集群本地路径或者HDFS路径,修改配置项为本地路径即可:
.config("spark.jars", "/path/to/your/jpmml-sparkml-xxx.jar")
方案2:已启动SparkSession的情况下动态加载JAR
如果不想重启当前已运行的Spark会话,可以直接用SparkContext的addJar方法运行时动态加载JPMML的JAR包,完全不修改原有配置:
# 提前把JAR包上传到集群可访问的路径,比如HDFS或者每个节点的本地路径 sc.addJar("/path/to/your/jpmml-sparkml-xxx.jar") # 加载完成后再导入pyspark2pmml使用即可 import pyspark2pmml
验证方法
加载完成后运行以下代码验证是否生效,不再抛出类路径找不到的错误即为配置成功:
# 替换为你自己的数据集schema和训练好的模型 pmml_builder = pyspark2pmml.PMMLBuilder(sc, df.schema, trained_model)
内容的提问来源于stack exchange,提问作者Adam Hoelscher
相关产品推荐
相关产品推荐

