我已经编写了一种方法来从RDD中筛选出重复项,并决定为该方法编写单元测试。这是我的方法:
def filterDupes(salesWithDupes: RDD[((String, String), SalesData)]): RDD[((String, String), SalesData)] = {
salesWithDupes.map(salesWithDupes => ((salesWithDupes._2.saleType, salesWithDupes._2.saleDate), salesWithDupes))
.reduceByKey((a, _) => a)
.map(_._2)
}
由于这是我第一次在Scala中编写测试的经历,因此我遇到了一些复杂问题。我是否将列表中的元素正确传递给过滤方法?
现在,我被困在如何验证方法返回的结果上。 我现在想到的唯一方法是将RDD的数据收集到列表中,然后检查其大小。这是正确的方法吗?
这是我如何看待测试的逻辑:
"Sales" should "be filtered" in {
Given("Sales RDD")
val rddWithDupes = sc.parallelize(Seq(
(("metric1", "metric2"), createSale("1", saleType = "Type1", saleDate = "2014-10-12")),
(("metric1", "metric2"), createSale("2", saleType = "Type1", saleDate = "2014-10-12")),
(("metric1", "metric2"), createSale("3", saleType = "Type3", saleDate = "2010-11-01"))
))
When("Sales RDD is filtered")
val filteredResult = SalesProcessor.filterDupes(rddWithDupes).collect.toList
Then("Sales are filtered")
filteredResult.size should be(2)
????
}
答案 0 :(得分:1)
我现在想到的唯一方法是将RDD的数据收集到列表中,然后检查其大小。这是正确的方法吗?
是的。分布式对象没有有意义的相等概念,并且缺少诸如以下的技巧:
您不能真正比较两个RDD。
还有另一个问题-混洗操作的不确定性(例如reduceByKey
)。您必须假设,每次运行和设计测试的结果可能会有所不同。
这使测试非常具有挑战性。实际上,我宁愿建议测试转换中使用的每个函数(避免不可测试的匿名混乱),并仅测试保证的不变式(大小,键集等)。