Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.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
为什么Java HashMap put不能在Spark Scala中工作?_Scala_Apache Spark - Fatal编程技术网

为什么Java HashMap put不能在Spark Scala中工作?

为什么Java HashMap put不能在Spark Scala中工作?,scala,apache-spark,Scala,Apache Spark,我有一个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| +---+----+ import java.util._ val jm

我有一个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|
+---+----+
import java.util._
val jmap = new java.util.HashMap[Integer, String]()

mydf1.rdd.foreach{case Row(id: Integer, col2: String) => jmap.put(id, col2)}
我尝试将上述数据帧添加到Java util HashMap中,如下所示:

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|
+---+----+
import java.util._
val jmap = new java.util.HashMap[Integer, String]()

mydf1.rdd.foreach{case Row(id: Integer, col2: String) => jmap.put(id, col2)}
但是在上面的代码之后,我仍然没有看到ID和COL2被添加到jmap HashMap中,如下所示:

scala> jmap.size
res13: Int = 0
我的实现中是否遗漏了什么


我知道我可以使用Scala转换器,但出于某种原因我不想使用它。

RDD是分布在集群中不同执行器中的分布式集合,并且在执行器节点中执行。而jmap是一个本地集合对象,尽管它被发送给各个执行者(因为它在foreach中被调用),但它不会返回到驱动程序并添加值

一种方法是,收集驱动程序中的所有rdd值,并将它们添加到jmap(但这对于大型收集是不可取的)


您是否意识到执行者正在填写在闭包中发送给他们每个人的jmap副本,而不是您在驱动程序中定义的jmap?无法从执行器更新驱动程序变量。我的最终目标是创建一个Java HashMap并将其写入磁盘。无论如何,我不能实现它吗?我想你早些时候问了一个类似的问题,我相信这是一个挑战。问题是,为什么您认为在磁盘上写入的正确解决方案是序列化Java HashMap。您实际要解决的问题是什么?Spark已经提供了很多方法,可以将
RDD\DF\DS
以多种格式(如CSV、JSON、Parquet、ORC)写入分布式文件系统(如HDFS或S3)。由于Spark是为“BigData”而设计的,因此(从概念上看)将数据写入本地磁盘是没有意义的,因为您的数据应该足够大,不足以填充一台机器-现在,如果您确定您的数据将填充一台机器,您可以先收集DF,然后保存本地scala收集。但是,你可以再次考虑到,你真的在使用SKAK来实现它。如果其他环境也使用相同的星星点集群和相同的文件系统(例如HDFS),你可能只想把它保存为实木地板,并将其作为java程序中的数据集读取。或者可以单独序列化每个对象(成对的流)。还要检查CSV为什么会让你慢下来。现在是解析时间吗?您是否将整个CSV读取到内存中?