spark闭包检测及序列化

/**
 * !!!!!
 * 闭包检测及序列化
 * 闭包检测:通俗理解函数或方法会用到方法体外的变量,所以编译的时候不光会检测方法体内语法等问题,会包含用到的方法体外的变量都检测了
 * 形式上“闭包”,“必包”
 * 序列化在spark程序中的常用场景,executor端有rdd要执行的算子和算子用到的部分数据,另外用到的类数据需要从driver端传到executor端
 * 这个类就需要序列化,extends Serializable(或者变成样例类)
 * 当然,除了序列化还有另外一种解决思路,就是尽量让方法只调用方法体内的属性,不使用类的属性
 */
/*object Test {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("wordCount")
    val sc: SparkContext = new SparkContext(sparkConf)

    val rdd = sc.makeRDD(List("hello","hive","hi","scala"))
    val search = new Search("h")

    search.getMatch4(rdd).collect().foreach(println)
    sc.stop
  }

  //extends Serializable
  class Search(query:String) extends Serializable {
    def isMatch(s:String): Boolean ={
      s.contains(query)
    }
    def getMatch1(rdd:RDD[String]): RDD[String] ={//这个方法需要序列化
      rdd.filter(isMatch)
    }
    def getMatch2(rdd:RDD[String]): RDD[String] ={//这个方法需要序列化
      rdd.filter(x=>x.contains(query))
    }
    def getMatch3(rdd:RDD[String]): RDD[String] ={//这个方法需要序列化
      rdd.filter(x=>x.contains(this.query))
    }
    def getMatch4(rdd:RDD[String]): RDD[String] ={//这个方法不用序列化
      val q = query
      rdd.filter(x=>x.contains(q))
    }
  }
}*/
/**
 * !!!!!
 * foreach
 * 序列化样例
 * !!!!!
 */

/*

object Test {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("wordCount")
    val sc: SparkContext = new SparkContext(sparkConf)

    val rdd = sc.makeRDD(List[Int](1,2,3,4))
    val user = new User()

    //RDD算子中传递的函数是会包含闭包操作,那么就会检测功能
    //闭包检测
    //闭包是一个函数,返回值依赖于声明在函数外部的一个或多个变量,闭包通常来讲可以简单的认为是可以访问一个函数里面局部变量的另外一个函数
    //所以即使rdd为空,看似不需要计算,对象也需要序列化,否则报错
    rdd.foreach(
      num => {
       println(user.age+num)}
    )
    sc.stop
  }

  //SparkException: Task not serializable
  //对象要进行序列化才可以进行io传输
  //java.io.NotSerializableException
  //user对象构建在driver端,rdd.foreach中println在Excutor执行,因此需要将user在网络中传递
  //所以 class User extends Serializable
  //或者 case class User(),因为样例类自动混入序列化特质(自动实现序列化接口)
  class User extends Serializable {
    var age = 30
  }
}
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值