​第2课 Scala面向对象彻底精通及Spark源码SparkContext,RDD阅读总结

简介:
本期内容:
1 Scala中的类、object实战详解
2 Scala中的抽象类、接口实战详解
3 综合案例及Spark源码解析

一:定义类
class HiScala{
private var name = "Spark"

def sayName(){
println(name)
}
def getName = name
}

Scala中,变量与类中的方法是同等级的,可以直接相互赋值。与java不同的是类中的属性必须初始化,例如name属性不初始化,就会报错。

scala中的get与set:
在Scala中,如果程序中给变量或方法前面定义了private,那么scala解释器会给这个变量或方法自动生成private的get和set方 
法,如果程序中没有给变量或方法前面定义了private,那么scala会给这个变量或方法自动生成public的get和set方法。这样可以直接在类的外部直接访问成员变量,但是运行上成员已经被scala私有,我们实际访问的是你们的set和get方法

创建类的对象 
val scal = new Hiscala
scal.sayName()
scal.sayName//如果不传参时,等同上面
scal.getName

var name="Spark" //如果不加private,默认会生成一个public的get和set方法,外部可以调

private[this] 对类对象较深层次的访问控制,对象私有属性,只能当前对象访问,这个属性是不能被类的其它对象访问的。如下:

Person{

private[this]var name =”spark”

def sayname() {println(name)}

def sayhello(person1:Person){

 println(“holle ” +person1.name )

}}

Var person1 =new Person()

Var person2 =new Person()

person1.sayhello(person2)    //这个scala时会报错的,因为name属性是对象私有的


类的构造器
注意:所有重载的构造器,都必须首先调用默认的构造器,或者说调用其它重载的构造器

类的构造器:重载
def this(name:String)
{
this() //调用默认的构造器
this.name=name
}

def this(name:String,age:Int){
this(name) //调用其它重载的构造器
this.age=age
}

这里的重载构造器,如果不调用默认构造器就会报错,在类的构造时,除了方法以外,类的其它语句都会被执行,一般可以用于类的初始化。如果不想让用户使用默认构造器:如下

Class person private(name: String){

Var name:String="Spart"

def this(name:String){

this.name=name}

}

伴生对象 object:
scala程序中,定义完类之后,一般会定义一个同名的object,它用于存放静态的成员或者方法,当我们第一次调 
用这个伴生对象时,它会执行object的构造方法,只是这个构造方法是不接受参数的,而且这个构造方法只会调用一次,以后不会 
在调用。

如果有个类和object类名相同,则称这个object类是同名类的伴生对象,同名类是该object类的伴生类;

定义:object Person{
println("Scala")
val salary=0.0
def getSalary=salary
}

伴生对象的apply方法:它就是当前类的对象的工厂方法,它可以控制对象的生成。大多数情况下,类是有其伴生对象的apply的方法实现的

scala不支持继承多个抽象类,关键字extends,但是可以继承多个接口,用with关键字

trait:工具方法的一个容器,通用功能都放这个里面,相当于Utils

SparkContext类源码解析:

 SparkContex位于项目的源码路径\spark-master\core\src\main\scala\org\apache\spark\SparkContext.scala中,源文件包含SparkContextClasss声明和其伴生对象SparkContextObject

  class SparkContext extends了Logging。Logging是一个trait,它是用于存放工具方法的一个容器,trait封装方法和字段。把trait混入到类中,就可以重用它们。一个类,可以继承任意多个trait,多个trait继承采用with来实现,可以将trait视为Java的接口interface,跟interface非常相似。唯一的差别在于,interface声明函数,但不实现它们,trait可以实现函数。

trait跟class的差别在于,trait没有任何类参数,trait调用的方法是动态绑定的。

class SparkContext类中有多个重载的构造方法:
如下:
def this(master: String, appName: String, conf: SparkConf) =
this(SparkContext.updatedConf(conf, master, appName))

@deprecated("Passing in preferred locations has no effect at all, see SPARK-10921", "1.6.0")
def this(
master: String,
appName: String,
sparkHome: String = null,
jars: Seq[String] = Nil,
environment: Map[String, String] = Map(),
preferredNodeLocationData: Map[String, Set[SplitInfo]] = Map()) =
{
this(SparkContext.updatedConf(new SparkConf(), master, appName, sparkHome, jars, environment))
if (preferredNodeLocationData.nonEmpty) {
logWarning("Passing in preferred locations has no effect at all, see SPARK-8949")
}
}


val startTime = System.currentTimeMillis()
startTime没有加上private,scala编译时,startTime这个变量是私有的,但会自动的生成它的public的get和set方法,供外部对象调用。

private[spark] val stopped: AtomicBoolean = new AtomicBoolean(false)
private[class_name] 指定可以访问该字段的类,访问的级别较严,在编译时,会自动的生成get和set方法,class_name必须是当前定义的类或类的外部类。

private def assertNotStopped(): Unit = {}
这个方法它是一个过程,因为返回值是Unit,没有结果返回。

 

RDD类源码解析:
class RDD它是个抽象类,

private[spark] def conf = sc.conf
private[class_name] 指定可以访问该字段的类,访问的级别较严,在编译时,会自动的生成get和set方法,class_name必须是当前定义的类或类的外部类。

class RDD类中有很多加了final修饰符的方法,表示:此方法或属性,子类继承此类时不可被覆写,如下:
final def dependencies: Seq[Dependency[_]] = {
checkpointRDD.map(r => List(new OneToOneDependency(r))).getOrElse {
if (dependencies_ == null) {
dependencies_ = getDependencies
}
dependencies_
}
}

final def partitions: Array[Partition] = {
checkpointRDD.map(_.partitions).getOrElse {
if (partitions_ == null) {
partitions_ = getPartitions
}
partitions_
}
}

final def getNumPartitions: Int = partitions.length
目录
相关文章
|
13天前
|
存储 分布式计算 并行计算
【赵渝强老师】Spark中的RDD
RDD(弹性分布式数据集)是Spark的核心数据模型,支持分布式并行计算。RDD由分区组成,每个分区由Spark Worker节点处理,具备自动容错、位置感知调度和缓存机制等特性。通过创建RDD,可以指定分区数量,并实现计算函数、依赖关系、分区器和优先位置列表等功能。视频讲解和示例代码进一步详细介绍了RDD的组成和特性。
|
1月前
|
消息中间件 分布式计算 NoSQL
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
大数据-104 Spark Streaming Kafka Offset Scala实现Redis管理Offset并更新
42 0
|
1月前
|
消息中间件 存储 分布式计算
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
大数据-103 Spark Streaming Kafka Offset管理详解 Scala自定义Offset
91 0
|
1月前
|
分布式计算 Java 大数据
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
39 0
大数据-92 Spark 集群 SparkRDD 原理 Standalone详解 ShuffleV1V2详解 RDD编程优化
|
1月前
|
消息中间件 分布式计算 Kafka
大数据-99 Spark 集群 Spark Streaming DStream 文件数据流、Socket、RDD队列流
大数据-99 Spark 集群 Spark Streaming DStream 文件数据流、Socket、RDD队列流
31 0
|
1月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
37 0
|
1月前
|
SQL 分布式计算 大数据
大数据-94 Spark 集群 SQL DataFrame & DataSet & RDD 创建与相互转换 SparkSQL
大数据-94 Spark 集群 SQL DataFrame & DataSet & RDD 创建与相互转换 SparkSQL
54 0
|
1月前
|
SQL 分布式计算 大数据
大数据-91 Spark 集群 RDD 编程-高阶 RDD广播变量 RDD累加器 Spark程序优化
大数据-91 Spark 集群 RDD 编程-高阶 RDD广播变量 RDD累加器 Spark程序优化
40 0
|
1月前
|
缓存 分布式计算 大数据
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
48 0
|
1月前
|
分布式计算 大数据 Java
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
大数据-87 Spark 集群 案例学习 Spark Scala 案例 手写计算圆周率、计算共同好友
50 5
下一篇
无影云桌面