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