在单元测试中模拟Spark RDD

Eda*_*ame 9 unit-testing scala mocking scalatest apache-spark

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

我想单元测试以下实用程序功能:

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

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

Hol*_*den 19

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


eli*_*sah 10

我非常赞同@Holden!

模拟RDDS很困难; 根据编程指南中的建议,首选在本地Spark上下文中执行单元测试.

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

单元测试

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

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

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

def mockRDD[T]: org.apache.spark.rdd.RDD[T] = null
Run Code Online (Sandbox Code Playgroud)

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