我遇到一个有线问题,结果不正确。
我有一个名为A的类,它有一个名为keyword
的值。
我想过滤RDD [A],如果它有一些keyword
。
Spark环境: 版本:1.3.1 执行环境:yarn-client
以下是代码:
class A ...
case class C(words:Set[String] ) extends Serializable {
def run(data:RDD[A])(implicit sc:SparkContext) ={
data.collect{ case x:A=> x }.filter(y => words.contains(y.keyword)).foreach(println)
}
}
// in main function
val data:RDD[A] = ....
val c = C(Set("abc"))
c.run(data)
上面的代码什么都没打印。但是,如果我将RDD [A]收集到本地,那么它会打印一些东西! E.g。
data.take(1000).collect{ case x:A=> x }.filter(y => words.contains(y.keyword)).foreach(println)}
这怎么可能发生?
让我问另一个相关问题:我应该case class C
延长Serializable
吗?我觉得没必要。
答案 0 :(得分:2)
原因很简单。如果在本地收集数据时运行println
函数,会发生什么情况是您的数据通过网络传输到您正在使用的计算机(让它称之为Spark环境的客户端)然后它打印在你的控制台上。到目前为止,一切都像预期的那样。相反,如果您在分布式 println
上运行RDD
功能,println
功能将在您的数据所在的工作机上本地执行。因此,该函数实际上已执行,但您不会在客户端的控制台上看到任何结果,除非它也是一个工作机器:实际上,所有内容都打印在相应工作节点的控制台上。
不,你没有必要Serializable
,唯一被序列化的是words:Set[String]
。