是否可以在不使用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?谢谢!
答案 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]
类型的空对象