尽管DataFrames相等,但sameElements和“ ==”返回不相等

时间:2019-05-21 10:24:03

标签: scala apache-spark dataframe scalatest

我正在尝试比较两个DataFrame是否具有相同的元素,并且尽管两个DataFrame唯一的行都是相同的,但它会返回“不相等”

DFa使用listBuffer.toDF检索,DFb读取csv文件。

//Things I´ve tried
assert(DFa.collect().head === DFb.collect().head)
//Returns -> [111,222,333] did not equal [111,222,333]

assert(DFa.collect() sameElements DFb.collect())
//Returns -> scala.this.Predef.refArrayOps[org.apache.spark.sql.Row](DFa.collect()).sameElements[org.apache.spark.sql.Row](scala.this.Predef.wrapRefArray[org.apache.spark.sql.Row](DFb.collect())) was false

assert(DFa.collect().toList sameElements DFb.collect().toList)
//Returns ->  scala.this.Predef.refArrayOps[org.apache.spark.sql.Row](DFa.collect()).toList.sameElements[org.apache.spark.sql.Row](scala.this.Predef.refArrayOps[org.apache.spark.sql.Row](DFb.collect()).toList) was false

//Tried with toSeq as well, and with ".deep" using "==" and same errors

我没有弄错,所有示例中的内容都是相同的,它们是相同的类型和长度,除了在DFa上我得到“ refArrayOps”和DFb我得到“ wrapRefArray”的地方

我想到的唯一解决方法是:

val List1= new ListBuffer[String]
val List2= new ListBuffer[String]
DFa.foreach(row => List1+= row.toString)
DFb.foreach(row => List2 += row.toString)
assert(List1 == List2)

但是我认为不是最好的解决方案,而且我还有另一个测试,它执行相同的“ sameElements”并成功运行。

1 个答案:

答案 0 :(得分:0)

@ olik1将我的工作推向正确的方向,在调整了有效的代码之后,他们没有相同的架构,这就是问题所在。