如何添加到运行 PySpark 会话的类路径

问题描述

我有一个在 AWS EMR 中运行的 PySpark 笔记本。在我的特定情况下,我想使用 pyspark2pmml 为我刚刚训练的模型创建 pmml。但是,我收到以下错误(运行 pyspark2pmml.PMMLBuilder 时,但我认为这无关紧要)。

JPMML-SparkML not found on classpath
Traceback (most recent call last):
  File "/tmp/1623111492721-0/lib/python3.7/site-packages/pyspark2pmml/__init__.py",line 14,in __init__
    raise RuntimeError("JPMML-SparkML not found on classpath")
RuntimeError: JPMML-SparkML not found on classpath

我知道这是因为我的 Spark 会话没有引用所需的类。我不知道如何使用可用的类启动 Spark 会话。我使用 %%conf -f 找到了另一个答案,但这改变了其他设置,从而使我无法使用我也需要的 sc.install_pypi_package

有没有一种方法可以让我使用可用的 JPMML 类启动 Spark 会话,但不更改任何其他设置?

解决方法

所以,这是一个的答案,但不是我想要的。

要将那个类添加到类路径中,我可以用这个开始我的工作:

%%configure -f
{
    "jars": [
        "{some_path_to_s3}/jpmml-sparkml-executable-1.5.13.jar"
    ]
}

这造成了我上面提到的问题,我无法sc.install_pypi_package。但是,我可以以更手动的方式添加该包。第一步是使用项目 github 中的 zip(在本例中,只是 pyspark2pmml 目录,而不是整个 zip)创建仅包含所需模块的 zip 文件。然后可以使用 sc.addPyFile

添加该模块
sc.addPyFile('{some_path_to_s3}/pyspark2pmml.zip')

此后,我可以完全按照预期运行原始命令。