Serialization 火花不能正确过滤?
我遇到一个有线问题,结果不正确。 我有一个名为a的类,它有一个名为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
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]