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))
  }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章