Как преобразовать Scala HashMap в Java HashMap для сериализации на диск? - PullRequest
0 голосов
/ 01 января 2019

У меня есть Scala HashMap, созданный из фрейма данных Spark.Я хочу преобразовать его в Java HashMap, который я хочу записать на диск.Позже я намереваюсь загрузить Java HashMap в производственную среду и использовать его в неискровой среде.

До сих пор я могу преобразовать массив данных Spark в Scala HashMap следующим образом:

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

+---+----+
| id|col2|
+---+----+
|  1|   a|
|  2|   b|
|  3|   c|
|  4|   d|
|  5|   e|
+---+----+

val mydfHash = mydf1.rdd.map{
    case Row(routeItemKey: String, kwrExpectedScore: Double) => (routeItemKey, kwrExpectedScore)}.collectAsMap()

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

import java.util._
import scala.collection.JavaConverters._


mydfHash.asJava

Я получаю ошибку java.lang.OutOfMemoryError: Java heap space.

Ниже приведены журналы трассировки стекачто я получаю для справки:

java.lang.OutOfMemoryError: Java heap space
  at java.util.Arrays.copyOf(Arrays.java:3332)
  at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
  at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
  at java.lang.StringBuilder.append(StringBuilder.java:136)
  at java.lang.StringBuilder.append(StringBuilder.java:131)
  at java.util.AbstractMap.toString(AbstractMap.java:559)
  at scala.runtime.ScalaRunTime$.scala$runtime$ScalaRunTime$$inner$1(ScalaRunTime.scala:332)
  at scala.runtime.ScalaRunTime$.stringOf(ScalaRunTime.scala:337)
  at scala.runtime.ScalaRunTime$.replStringOf(ScalaRunTime.scala:345)
  at .$print$lzycompute(<console>:10)
  at .$print(<console>:6)
  at $print(<console>)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:786)
  at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:1047)
  at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:638)
  at scala.tools.nsc.interpreter.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:637)
  at scala.reflect.internal.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31)
  at scala.reflect.internal.util.AbstractFileClassLoader.asContext(AbstractFileClassLoader.scala:19)
  at scala.tools.nsc.interpreter.IMain$WrappedRequest.loadAndRunReq(IMain.scala:637)
  at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:569)
  at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:565)
  at org.apache.zeppelin.spark.SparkScala211Interpreter.scalaInterpret(SparkScala211Interpreter.scala:143)
  at org.apache.zeppelin.spark.SparkScala211Interpreter$$anonfun$interpret$1$$anonfun$apply$2.apply(SparkScala211Interpreter.scala:122)
  at org.apache.zeppelin.spark.SparkScala211Interpreter$$anonfun$interpret$1$$anonfun$apply$2.apply(SparkScala211Interpreter.scala:116)
  at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:733)
  at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
  at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
  at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:732)

Почему collectAsMap () работает, но asJava не удается?Я думал, что collectAsMap также собирает каждый RDD для главного узла Spark.Таким образом, если collectAsMap не дает сбоя, то в идеале asJava также не должен завершаться с ошибкой из-за нехватки памяти кучи.

Обновление 1

Действительно ли мне нужно преобразовать Scala HashMap в Java Hashmap?Разве невозможно экспортировать сериализованный Scala HashMap в файл и загрузить этот Scala HashMap в Java HashMap в среде Java?Потому что и Scala, и Java работают в JVM.

1 Ответ

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

Почему collectAsMap() работает, но asJava не работает?

Насколько я понимаю, ниже приводится обоснование:

Когда вы используете asJava, внутренне он использует StringBuilderсоздать массив и StringBuilder, который пытается построить массив больше, чем Integer.MAX_VALUE (не может выделить массив, который содержит больше, чем элементы Integer.MAX_VALUE).С StringBuilder вы можете накопить 1 207 959 550 символов - намного меньше, чем Integer.MAX_VALUE.

Надеюсь, это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...