繁体   English   中英

在Scala Spark中未调用RDD的映射函数

[英]Map function of RDD not being invoked in Scala Spark

当我调用RDD的map函数时,没有应用。 它对于scala.collection.immutable.List的预期工作,但不适用于RDD。 以下是一些代码来说明:

val list = List ("a" , "d" , "c" , "d")
list.map(l => {
  println("mapping list")
})

val tm = sc.parallelize(list)
tm.map(m => {
  println("mapping RDD")
})

上述代码的结果是:

mapping list
mapping list
mapping list
mapping list

但是注意“映射RDD”没有打印到屏幕上。 为什么会这样?

这是我试图从RDD填充HashMap的更大问题的一部分:

  def getTestMap( dist: RDD[(String)]) = {

    var testMap = new java.util.HashMap[String , String]();

    dist.map(m => {
      println("populating map")
      testMap.put(m , m)

    })
    testMap
  }
val testM = getTestMap(tm)
println(testM.get("a"))

此代码打印为null

这是由于懒惰的评价?

如果map是您正在执行的唯一操作,则延迟评估可能是此的一部分。 在RDD沿袭请求操作 (以Spark术语表示)之前,Spark不会安排执行。

当你执行一个动作时, println会发生,但不会发生在你期望它的驱动程序上,而是在执行该闭包的slave上。 尝试查看工人的日志。

在问题的第二部分中, hashMap人口也发生了类似的事情。 将在每个分区上,在单独的工作程序上执行相同的代码,并将序列化回驱动程序。 鉴于Spark已对“闭包”进行“清理”,可能会从序列化闭包中删除testMap ,从而导致null 需要注意的是,如果这只是由于map没有被执行,HashMap的应该是空的,没有空。

如果要将RDD的数据传输到另一个结构,则需要在驱动程序中执行此操作。 因此,您需要强制Spark将所有数据传递给驱动程序。 这是rdd.collect()的功能。

这适用于您的情况。 请注意,所有RDD数据都应该适合您的驱动程序内存:

import scala.collection.JavaConverters._
def getTestMap(dist: RDD[(String)]) =  dist.collect.map(m => (m , m)).toMap.asJava

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM