在单元测试中模拟Spark RDD

时间:2015-06-19 18:26:33

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

是否可以在不使用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?谢谢!

2 个答案:

答案 0 :(得分:18)

RDD非常复杂,嘲笑它们可能不是创建测试数据的最佳方式。相反,我建议对您的数据使用sc.parallelize。我(有些偏见)认为https://github.com/holdenk/spark-testing-base可以通过提供设置和特征的特性来提供帮助。为您的测试拆解Spark Context。

答案 1 :(得分:10)

我完全同意@Holden的意见!

模拟RDDS很困难;在本地执行单元测试 根据{{​​3}}中的建议,首选Spark上下文。

我知道这在技术上可能不是单元测试,但希望它很接近 足够。

  

单元测试

     

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

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

他们伪造RDD的唯一原因是测试implict是否适用于编译器,但他们实际上并不需要真正的RDD。

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

它甚至不是真正的模拟。它只是创建一个RDD [T]

类型的空对象