为spark-testing-base

时间:2019-02-07 17:14:01

标签: python unit-testing apache-spark pyspark

当我尝试在Python中使用spark-testing-base时,我需要测试一个在Postgres DB上编写的函数。

为此,有必要向Spark会话提供驱动程序以连接到Posgtres;为了实现这一点,我首先尝试覆盖getConf() method(如评论Override this to specify any custom configuration.中所述)。但是显然这是行不通的。可能我没有使用所需的语法或任何其他方式传递值,但是经过多次尝试,我仍然收到错误java.lang.ClassNotFoundException: org.postgresql.Driver(通常是通过conf参数未正确下载Driver Jar的情况)。

尝试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()方法?

2 个答案:

答案 0 :(得分:0)

不确定如何在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。

答案 1 :(得分:0)

有必要重写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传递给外部库中的Spark测试库。

Leonardo Noleto的积分:https://github.com/holdenk/spark-testing-base/issues/281#event-2200108290