Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Scala HashMap转换为Java HashMap以序列化到磁盘?_Java_Scala_Apache Spark_Hashmap - Fatal编程技术网

如何将Scala HashMap转换为Java HashMap以序列化到磁盘?

如何将Scala HashMap转换为Java HashMap以序列化到磁盘?,java,scala,apache-spark,hashmap,Java,Scala,Apache Spark,Hashmap,我用Spark数据帧创建了一个Scala HashMap。我想把它转换成一个Java HashMap,我想把它写到磁盘上。稍后,我打算在生产环境中加载Java HashMap,并在非spark环境中使用它 到目前为止,我能够将Spark数据帧转换为Scala HashMap,如下所示: val mydf1 = Seq((1, "a"), (2, "b"),(3, "c"),(4, "d"),(5, "e")).toDF("id", "col2") mydf1.show +---+----+ |

我用Spark数据帧创建了一个Scala HashMap。我想把它转换成一个Java HashMap,我想把它写到磁盘上。稍后,我打算在生产环境中加载Java HashMap,并在非spark环境中使用它

到目前为止,我能够将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()
import java.util._
import scala.collection.JavaConverters._


mydfHash.asJava
但是,当我尝试将上述Scala HashMap转换为Java 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()
import java.util._
import scala.collection.JavaConverters._


mydfHash.asJava
我得到了一个
java.lang.OutOfMemoryError:java堆空间
错误

以下是我获取的stacktrace日志,以供参考:

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)
java.lang.OutOfMemoryError:java堆空间
位于java.util.Arrays.copyOf(Arrays.java:3332)
位于java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
位于java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
在java.lang.StringBuilder.append(StringBuilder.java:136)
在java.lang.StringBuilder.append(StringBuilder.java:131)
位于java.util.AbstractMap.toString(AbstractMap.java:559)
在scala.runtime.scalarantime$.scala$运行时$scalarantime$$内部$1(scalarantime.scala:332)
在scala.runtime.scalarantime$.stringOf处(scalarantime.scala:337)
在scala.runtime.scalarontime$.replStringOf(scalarontime.scala:345)
at.$print$lzycompute(:10)
至少$print(:6)
$print()
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
在scala.tools.nsc.explorer.IMain$ReadEvalPrint.call中(IMain.scala:786)
位于scala.tools.nsc.explorer.IMain$Request.loadAndRun(IMain.scala:1047)
在scala.tools.nsc.explorer.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:638)
在scala.tools.nsc.explorer.IMain$WrappedRequest$$anonfun$loadAndRunReq$1.apply(IMain.scala:637)
位于scala.reflect.internal.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31)
位于scala.reflect.internal.util.AbstractFileClassLoader.asContext(AbstractFileClassLoader.scala:19)
位于scala.tools.nsc.explorer.IMain$WrappedRequest.loadAndRunReq(IMain.scala:637)
在scala.tools.nsc.explorer.IMain.explore(IMain.scala:569)中
在scala.tools.nsc.explorer.IMain.explore(IMain.scala:565)中
在org.apache.zeppelin.SparkScala211Interpreter.scalaInterpret上(SparkScala211Interpreter.scala:143)
在org.apache.zeppelin.SparkScala211Interpreter$$anonfun$exploration$1$$anonfun$apply$2.apply上(SparkScala211Interpreter.scala:122)
在org.apache.zeppelin.SparkScala211Interpreter$$anonfun$exploration$1$$anonfun$apply$2.apply上(SparkScala211Interpreter.scala:116)
在scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply处(TraversableLike.scala:733)
在scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
位于scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
位于scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:732)
为什么collectAsMap()可以工作,而asJava却失败了?我想
collectamap
也会将每个RDD收集到Spark主节点。因此,如果
collectAsMap
没有失败,那么理想情况下
asJava
也不应该因为堆内存不足而失败

更新1
我真的需要将Scala HashMap转换为Java HashMap吗?不可能将Scala HashMap序列化导出到文件中,并将此Scala HashMap加载到Java环境中的Java HashMap中吗?因为Scala和Java都在JVM中运行。

为什么
collectAsMap()
可以工作,而
asJava
却失败了

根据我的理解,以下是理由:

当您使用
asJava
时,它在内部使用
StringBuilder
创建数组,并尝试构建大于Integer.MAX\u值的数组(无法分配大于Integer.MAX\u值元素的数组)。 使用
StringBuilder
可以累积1207959550个字符-远小于Integer.MAX_值


希望这有所帮助。

可能的重复:要将任何数据结构转换为另一个数据结构,您需要足够的空间来容纳现有的数据结构和新的数据结构。因此,您需要大约两倍的内存大小,可能更多,这取决于所讨论的数据结构。所以,当你这样做的时候,你当然可能会耗尽内存。@realponsist在我的Spark集群中,当我将数据帧保存到csv文件时,结果显示只有90MB。然后,我将相同的数据帧转换为hashmap,然后转换为Java hashmap,并得到这个异常。所以90*3=270 MB仍然比我的5GB驱动程序节点内存小。您收集的不是数据帧。这是一对。如果希望留在数据帧世界中,则应使用数据集操作。现在还不清楚为什么要将结果序列化为一个对象,而不是像JSON或CSV这样的可读、语言不可知的格式。为什么不以某种不可知的格式写入磁盘?JSON?亚马尔?或者使用ProtoBuf或Avro这样的紧凑格式?