Почему Java HashMap не работает в Spark Scala? - PullRequest
0 голосов
/ 01 января 2019

У меня есть пример кадра данных Spark следующим образом:

val mydf1 = Seq((1, "a"), (2, "b"),(3, "c"),(4, "d"),(5, "e")).toDF("id", "col2")

scala> mydf1.show
+---+----+
| id|col2|
+---+----+
|  1|   a|
|  2|   b|
|  3|   c|
|  4|   d|
|  5|   e|
+---+----+

Я пытаюсь добавить вышеупомянутый кадр данных в утилиту Java HashMap следующим образом:

import java.util._
val jmap = new java.util.HashMap[Integer, String]()

mydf1.rdd.foreach{case Row(id: Integer, col2: String) => jmap.put(id, col2)}

Но после того, как вышекод Я до сих пор не вижу, как идентификаторы и столбцы добавляются в Jmap HashMap, как показано ниже:

scala> jmap.size
res13: Int = 0

Я что-то упустил в своей реализации?

Я знаю, что могу использовать конвертеры Scala, но по какой-то причине я не хочу его использовать.

1 Ответ

0 голосов
/ 01 января 2019

RDD - это распределенная коллекция, распределенная по разным исполнителям в кластере, и foreach выполняется в узлах исполнителей.Принимая во внимание, что jmap является локальным объектом коллекции, хотя он отправляется отдельным исполнителям (поскольку он вызывается в пределах foreach ), ноон не вернется к драйверу с добавленными значениями.

Один из способов - собрать все значения rdd в драйвере и добавить их в jmap (Но это не рекомендуется для большой коллекции)

mydf1.rdd.collect().foreach{case Row(id: Integer, col2: String) => jmap.put(id, col2)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...