Scala单元测试:如何验证返回的RDD

时间:2018-07-06 11:22:11

标签: scala unit-testing apache-spark testing mapreduce

我已经编写了一种方法来从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)
    ????
  }

1 个答案:

答案 0 :(得分:1)

  

我现在想到的唯一方法是将RDD的数据收集到列表中,然后检查其大小。这是正确的方法吗?

是的。分布式对象没有有意义的相等概念,并且缺少诸如以下的技巧:

  • 检查尺寸是否相同。
  • 检查从b中减去a是否为空
  • 检查从a中减去b是否为空

您不能真正比较两个RDD。

还有另一个问题-混洗操作的不确定性(例如reduceByKey)。您必须假设,每次运行和设计测试的结果可能会有所不同。

这使测试非常具有挑战性。实际上,我宁愿建议测试转换中使用的每个函数(避免不可测试的匿名混乱),并仅测试保证的不变式(大小,键集等)。