Spark无法正确过滤?

时间:2015-05-25 06:05:02

标签: serialization apache-spark

我遇到一个有线问题,结果不正确。 我有一个名为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吗?我觉得没必要。

1 个答案:

答案 0 :(得分:2)

原因很简单。如果在本地收集数据时运行println函数,会发生什么情况是您的数据通过网络传输到您正在使用的计算机(让它称之为Spark环境的客户端)然后它打印在你的控制台上。到目前为止,一切都像预期的那样。相反,如果您在分布式 println上运行RDD功能,println功能将在您的数据所在的工作机上本地执行。因此,该函数实际上已执行,但您不会在客户端的控制台上看到任何结果,除非它也是一个工作机器:实际上,所有内容都打印在相应工作节点的控制台上。

不,你没有必要Serializable,唯一被序列化的是words:Set[String]