Класс 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, и они также совпадают.

Пожалуйста, помогите мне найти причину этой странной ситуации.

0 ответов

Другие вопросы по тегам