【发布时间】:2021-01-01 23:12:09
【问题描述】:
在测试中,我正在尝试将数据帧/数据集转换为集合并进行比较。例如
actualResult.collect.toSet should be(expectedResult.collect.toSet)
我注意到一些关于 Double.NaN 价值的事实。
- 在 Scala 中,
Double.NaN == Double.NaN返回 false。 - 在火花中
NaN == NaN是真的。 (offical doc)
但我无法弄清楚为什么数据框和数据集的行为不同。
import org.apache.spark.sql.SparkSession
object Main extends App {
val spark = SparkSession.builder().appName("Example").master("local").getOrCreate()
import spark.implicits._
val dataSet = spark.createDataset(Seq(Book("book 1", Double.NaN)))
// Compare Set(Book(book 1,NaN)) to itself
println(dataSet.collect.toSet == dataSet.collect.toSet) //false, why?
// Compare Set([book 1,NaN]) to itself
println(dataSet.toDF().collect.toSet == dataSet.toDF().collect.toSet) //true, why?
}
case class Book (title: String, price: Double)
这是我的问题。欣赏任何见解。
- 它在代码中是如何发生的? (
equals在哪里被覆盖?等等) - 这种设计背后有什么原因吗?是否有更好的范例来在测试中断言数据集/数据框?
【问题讨论】:
标签: scala dataframe apache-spark dataset nan