序列化



 序列化就是指将一个对象转化为二进制的byte流(注意,不是bit流),然后以文件的方式进行保存或通过网络传输,等待被反序列化读取出来。序列化常被用于数据存取和通信过程中。

Spark是分布式执行引擎,其核心抽象是弹性分布式数据集RDD,其代表了分布在不同节点的数据。

Spark的计算是在executor上分布式执行的,故用户开发的关于RDD的操作(闭包)有如下执行过程: 
1. 代码中对象在driver本地序列化 
2. 对象序列化后传输到远程executor节点 
3. 远程executor节点反序列化对象 
4. 最终远程节点执行 
故对象在执行中需要序列化通过网络传输,则必须经过序列化过程。

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

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

    val conf: SparkConf = new SparkConf().setAppName("My scala word count").setMaster("local")
    val sc = new SparkContext(conf)

    val rdd: RDD[String] = sc.makeRDD(List("hadoop","python","java"))

    val search = new Search("h")

    val rdd1: RDD[String] = search.getMatch1(rdd)
    rdd1.collect().foreach(println)

    val rdd2: RDD[String] = search.getMatch2(rdd)
    rdd2.collect().foreach(println)


  }

}


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

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

  def getMatch2(rdd:RDD[String]):RDD[String]={
    rdd.filter(x=>x.contains(query))
  }
}

  

posted on 2020-09-24 14:26  happygril3  阅读(171)  评论(0)    收藏  举报

导航