Я пытаюсь получить доступ к HashMap с помощью функции в Spark 2.0, но если я распараллеливаю List, он терпит неудачу. Если я этого не делаю, он работает, и если я не использую класс Case, он работает.Объект класса case Scala «ключ не найден» при использовании в качестве ключа HashMap в Spark
Вот некоторые примеры кода, что я пытаюсь сделать:
case class TestData(val s: String)
def testKey(testData: TestData) {
println(f"Current Map: $myMap")
println(f"Key sent into function: $testData")
println("Key isn't found in Map:")
println(myMap(testData)) // fails here
}
val myList = sc.parallelize(List(TestData("foo")))
val myMap = Map(TestData("foo") -> "bar")
myList.collect.foreach(testKey) // collect to see println
Вот точный выход:
Current Map: Map(TestData(foo) -> bar)
Key sent into function: TestData(foo)
Key isn't found in Map:
java.util.NoSuchElementException: key not found: TestData(foo)
Код выше похож на то, что я пытаюсь сделать, за исключением того, что класс case более сложный, а HashMap имеет списки как значения. Также в вышеприведенном примере я использую «collect», чтобы выводились инструкции печати. Образец по-прежнему дает ту же ошибку без сбора, но без отпечатков.
Совпадение hashCodes уже, но я попытался переопределить равные и hashCode для класса case, той же проблемой.
Это использование Databricks, поэтому я не верю, что у меня есть доступ к REPL или spark-submit.
Выше был только код, который я написал чтобы воссоздать проблему, с которой я столкнулся. В моем производственном коде мне приходится отправлять разные ключи, чтобы вернуть свои ценности, иногда они совпадают, иногда они этого не делают. И я хотел держать его параллельным на разных узлах без чрезмерного использования данных/сети. Но из-за ошибки Искры я не получил ни одного матча. Я должен был переопределить равные в классе case, чтобы получить любые совпадения. – TBhimdi
Даже в этом случае ваш код неверен. Вы передаете RDD и вызываете TestData в myMap. И обновив код выше, определите myMap сразу после объявления TestData (а не внутри testKey()), чтобы избежать повторного объявления. – KiranM