Класс Case в оболочке Spark показывает отличные результаты от IDE
Я столкнулся с непонятной проблемой. Когда я тестировал приведенный ниже код с помощью IDE, например, IntelliJ, результат был верным.
val sparkConf = new SparkConf().setAppName("QueryMySql").setMaster("local")
val sc = new SparkContext(sparkConf)
case class Store(val name : String) {
override def equals(o : Any) = o match {
case that: Store => that.name.equals(this.name)
case _ => false
}
override def hashCode = name.hashCode
}
val storeAddressList = List(
(Store("Candy") , "dongilStreet 1"),
(Store("Choco") , "kangnam Street 2"),
(Store("Choco") , "bongchen Street 3"),
(Store("Icecream") , "samsung street 4")
)
val storeAddress = sc.parallelize(storeAddressList)
val storeRatingList = List(
(Store("Candy") , 4.9),
(Store("Choco") , 4.8)
)
val storeRating = sc.parallelize(storeRatingList)
storeAddress.collect
storeRating.collect
println(storeAddress.first._1.equals(storeRating.first._1))
Однако я запустил тот же код, который удалил первую и вторую строки с помощью spark-shell. Это было:
case class Store(val name : String) {
override def equals(o : Any) = o match {
case that: Store => that.name.equals(this.name)
case _ => false
}
override def hashCode = name.hashCode
}
val storeAddressList = List(
(Store("Candy") , "dongilStreet 1"),
(Store("Choco") , "kangnam Street 2"),
(Store("Choco") , "bongchen Street 3"),
(Store("Icecream") , "samsung street 4")
)
val storeAddress = sc.parallelize(storeAddressList)
val storeRatingList = List(
(Store("Candy") , 4.9),
(Store("Choco") , 4.8)
)
val storeRating = sc.parallelize(storeRatingList)
storeAddress.collect
storeRating.collect
println(storeAddress.first._1.equals(storeRating.first._1))
и результат ложный.
Чтобы выяснить причину, я попробовал это: прежде всего, я проверил storeRating.first._1, потому что storeAddress имеет 4 раздела и каждый раздел имеет значение. Напротив, storeRating имеет 2 раздела, и только два из них имеют значение. Итак, я думал, что это будет
Магазин (Candy).equals(нуль)
но, это было неправильно, они имеют ценность.
Во-вторых, я заподозрил хэш-код класса дел Store, но, к сожалению, у них такой же хэш-код.
scala> println(storeAddress.first._1.hashCode())
64874565
scala> println(storeRating.first._1.hashCode())
64874565
В-третьих, я проверил значения storeAddress и storeRating, и они также совпадают.
Пожалуйста, помогите мне найти причину этой странной ситуации.