SparkRDD的函数传递

在实际开发中,我们需要根据实际情况自定义一些RDD的操作,但是我们自定义的RDD操作在Driver端工作,而任务在Executor端工作,这就涉及到了跨进程通信,也就是必须进行序列化。

传递函数

package com.day1

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD

object SeriTest {
  def main(args: Array[String]): Unit = {

    //1.初始化配置信息及SparkContext
    val sparkConf: SparkConf = new SparkConf().setAppName("WordCount").setMaster("local[*]")
    val sc = new SparkContext(sparkConf)

    //2.创建一个RDD
    val rdd: RDD[String] = sc.parallelize(Array("hadoop", "spark", "hive", "atguigu"))

    //3.创建一个Search对象
    val search = new Search("h")

    //4.运用第一个过滤函数并打印结果
    val match1: RDD[String] = search.getMatche1(rdd)
    match1.collect().foreach(println)
  }
}


class Search(query:String) extends Serializable{  // 必须继承Serializable序列化
  //过滤出包含字符串的数据
  def isMatch(s: String): Boolean = {
    s.contains(query)  // 元素包含传入的query字符的话,返回true
  }

  //过滤出包含字符串的RDD
  def getMatche1 (rdd: RDD[String]): RDD[String] = {
     rdd.filter(isMatch)	// 过滤掉没有包含query字符的元素
  }

  //过滤出包含字符串的RDD
  def getMatche2(rdd: RDD[String]): RDD[String] = {
    rdd.filter(x => x.contains(query))	// 将两个方法写在一起
  }
}

传递属性

package com.day1

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object TransmitTest {
  def main(args: Array[String]): Unit = {

    //1.初始化配置信息及SparkContext
    val sparkConf: SparkConf = new SparkConf().setAppName("WordCount").setMaster("local[*]")
    val sc = new SparkContext(sparkConf)

    //2.创建一个RDD
    val rdd: RDD[String] = sc.parallelize(Array("hadoop", "spark", "hive", "atguigu"))

    //3.创建一个Search对象
    val search = new Search("h")

    //4.运用第一个过滤函数并打印结果
    val match1: RDD[String] = search.getMatche2(rdd)
    match1.collect().foreach(println)
  }
}

class Search(query:String) extends Serializable{
  //过滤出包含字符串的数据
  def isMatch(s: String): Boolean = {
    s.contains(query)
  }

  //过滤出包含字符串的RDD
  def getMatche1 (rdd: RDD[String]): RDD[String] = {
    rdd.filter(isMatch)
  }

  //过滤出包含字符串的RDD
  def getMatche2(rdd: RDD[String]): RDD[String] = {
    val query_ : String = this.query//将类变量赋值给局部变量
    rdd.filter(x => x.contains(query_))
  }
}

你可能感兴趣的:(#,---SparkCore,spark)