当我尝试在Python中使用spark-testing-base时,我需要测试一个在Postgres DB上写入的函数。
为此,必须向 Spark 会话提供连接到 Posgtres的驱动程序;为此,我首先尝试覆盖 getConf()
方法(如注释Override this to specify any custom configuration.
中所述(。但显然它不起作用。可能我没有使用所需的语法或其他任何东西传递值,但经过多次尝试,我还是java.lang.ClassNotFoundException: org.postgresql.Driver
得到错误(典型的驱动程序 Jar 未通过 conf 参数正确下载时(。
尝试getConf
覆盖:
def getConf(self):
return ("spark.jars.packages", "org.postgresql:postgresql:42.1.1")
def getConf(self):
return {"spark.jars.packages", "org.postgresql:postgresql:42.1.1"}
def getConf(self):
return SparkConf()
.setMaster("local[*]")
.setAppName("test")
.set("spark.jars.packages", "org.postgresql:postgresql:42.1.1")
所以我什至尝试像这样覆盖the setUp()
方法:
def setUp(self):
try:
from pyspark.sql import Session
self.session = Session.Builder.config("spark.jars.packages", "org.postgresql:postgresql:42.1.1")
self.sqlCtx = self.session._wrapped
except Exception:
self.sqlCtx = SQLContext(self.sc)
但仍然没有运气。那么我做错了什么?我应该如何覆盖getConf()
方法?
不确定如何在 python 中执行此操作。在scala中,使用sbt,这是非常简单的。但无论如何,这里找到System.setProperty("spark.jars.packages", "org.postgresql:postgresql:42.1.1")
方法:https://github.com/holdenk/spark-testing-base/issues/187 对我有用。
所以我会查看如何使用python + spark来做到这一点。
有必要重写 setUpClass 方法:
@classmethod
def setUpClass(cls):
"""Setup a basic Spark context for testing"""
class_name = cls.__name__
conf = SparkConf().set("spark.jars.packages", "org.postgresql:postgresql:42.1.1")
cls.sc = SparkContext(cls.getMaster(), appName=class_name, conf=conf)
quiet_py4j()
然后以这种方式可以传递到Spark测试库的外部jar。
致谢莱昂纳多·诺莱托:https://github.com/holdenk/spark-testing-base/issues/281#event-2200108290