Serialization 火花不能正确过滤?

Serialization 火花不能正确过滤?,serialization,apache-spark,Serialization,Apache Spark,我遇到一个有线问题,结果不正确。 我有一个名为a的类,它有一个名为keyword的值。 如果RDD[A]有一些关键字,我想过滤它 Spark环境: 版本:1.3.1 执行环境:纱线客户机 代码如下: class A ... case class C(words:Set[String] ) extends Serializable { def run(data:RDD[A])(implicit sc:SparkContext) ={ data.collect{ case x:A=&g

我遇到一个有线问题,结果不正确。 我有一个名为a的类,它有一个名为
keyword
的值。 如果RDD[A]有一些
关键字,我想过滤它

Spark环境: 版本:1.3.1 执行环境:纱线客户机

代码如下:

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]到本地,那么它会打印一些东西!例如

data.take(1000).collect{ case x:A=> x }.filter(y => words.contains(y.keyword)).foreach(println)}
这怎么会发生


让我问另一个相关的问题:我是否应该使
案例类C
扩展
可序列化
?我认为没有必要。原因很简单。如果在本地收集数据时运行
println
功能,则会发生以下情况:数据通过网络传输到正在使用的机器(我们称之为Spark环境的客户端),然后在控制台上打印。到目前为止,一切正常。相反,如果在分布式
RDD
上运行
println
函数,则
println
函数将在包含数据的工作机器上本地执行。因此,函数实际上是执行的,但在客户端的控制台上看不到任何结果,除非它也是一台工作机器:事实上,所有内容都打印在相应工作节点的控制台上

不,没有必要将其设置为可序列化的,唯一序列化的是您的
单词:Set[String]