【问题标题】:Mock a Spark RDD in the unit tests在单元测试中模拟 Spark RDD
【发布时间】:2015-09-05 20:05:56
【问题描述】:

是否可以在不使用 sparkContext 的情况下模拟 RDD?

我想对以下实用函数进行单元测试:

 def myUtilityFunction(data1: org.apache.spark.rdd.RDD[myClass1], data2: org.apache.spark.rdd.RDD[myClass2]): org.apache.spark.rdd.RDD[myClass1] = {...}

所以我需要将 data1 和 data2 传递给 myUtilityFunction。如何从模拟 org.apache.spark.rdd.RDD[myClass1] 创建 data1,而不是从 SparkContext 创建真正的 RDD?谢谢!

【问题讨论】:

  • 为什么不能呢?这些只是基本对象,您可以模拟它们,但很可能使用 sc.parallelize 通常比模拟 map/flatMap/... 方法更容易。

标签: scala unit-testing mocking apache-spark scalatest


【解决方案1】:

RDD 非常复杂,模拟它们可能不是创建测试数据的最佳方式。相反,我建议将 sc.parallelize 与您的数据一起使用。我也(有些偏见)认为https://github.com/holdenk/spark-testing-base 可以通过提供一个特性来为您的测试设置和拆除 Spark 上下文来提供帮助。

【讨论】:

  • 看来 spark-testing-base 最新版本适用于 Spark 1.5 - 是否有任何选项可用于使用 Spark 2+ 进行测试?
  • 有,当前版本支持2.1
【解决方案2】:

我完全同意@Holden 的观点!

模拟 RDDS 很困难;在本地执行单元测试 首选 Spark 上下文,如 programming guide 中所建议的那样。

我知道这在技术上可能不是一个单元测试,但它有望接近 够了。

单元测试

Spark 对使用任何流行的单元测试框架进行单元测试都很友好。 只需在您的测试中创建一个 SparkContext 并将主 URL 设置为本地,运行您的操作,然后调用 SparkContext.stop() 将其拆除。确保在 finally 块或测试框架的 tearDown 方法中停止上下文,因为 Spark 不支持在同一程序中同时运行两个上下文。

但是如果你真的很感兴趣并且仍然想尝试模拟 RDD,我建议你阅读ImplicitSuite 测试代码。

他们伪模拟 RDD 的唯一原因是测试 implict 是否与编译器一起工作,但他们实际上并不需要真正的 RDD。

def mockRDD[T]: org.apache.spark.rdd.RDD[T] = null

它甚至不是一个真正的模拟。它只是创建了一个 RDD[T] 类型的空对象

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-01
    • 2019-12-13
    • 2015-12-26
    • 2017-02-09
    • 2018-11-27
    • 1970-01-01
    • 2015-05-04
    • 2016-11-14
    相关资源
    最近更新 更多