Spark RDD中函数的传递

在RDD中传递函数,代码的初始化在Driver端,运行在Executor端,所以传递时要对类进行序列化

如下:

class Search(query:String) extends Serializable {

  def isMatch(s:String): Boolean ={
    s.contains(query)
  }

  def getMatchFunctionReference(rdd:RDD[String]): RDD[String] = {
    //isMatch 表示"this.isMatch",因此要传递整个this,这种使用,类必须序列化
    rdd.filter(isMatch)
  }
  def getMatcheFieldReference(rdd:RDD[String]):RDD[String]={
    //query表示this.query,因此要传递整个this,这种使用类必须序列化
    rdd.filter(x=>x.contains(query))
  }
  def getMatchNoReference(rdd:RDD[String]): RDD[String] ={
    //使用局部变量
    val query1= this.query
      rdd.filter(_.contains(query1))
  }
}

使用此代码

def main(args: Array[String]): Unit = {
    var conf = new SparkConf().setAppName("master").setMaster("local[*]")
    var sc = new SparkContext(conf)
    sc.setLogLevel( "ERROR")
    var sourceRdd=sc.parallelize(Array("hadoop","hive","spark"))
    val  search = new Search("s")
    val resultRdd=search.getMatchFunctionReference(sourceRdd)
        resultRdd.foreach(u=>println(u))
  }

 

 

你可能感兴趣的:(spark)