【问题标题】:Scala Unit test: how to validate the returned RDDScala单元测试:如何验证返回的RDD
【发布时间】:2023-03-08 21:03:01
【问题描述】:

我编写了一个方法来过滤掉 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)
    ????
  }

【问题讨论】:

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


    【解决方案1】:

    我现在想出的唯一方法是将 RDD 的数据收集到一个列表中,然后检查它的大小。方法对吗?

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

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

    你无法真正比​​较两个 RDD。

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

    这使得测试非常具有挑战性。在实践中,我宁愿建议测试转换中使用的每个函数(避免无法测试的匿名混乱)并只测试有保证的不变量(大小、键集等)。

    【讨论】:

    • 我也试过filteredResult should have size 2,测试成功。所以这里只是语法上的不同,对吧?
    猜你喜欢
    • 1970-01-01
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多