第一部分总结
一:定义类
class HiScala { private var name = "Spark" def sayName(){ println(name) } def getName = name }
Scala中,变量与类中的方法是同等级的,可以直接赋值给方法。
scala中的get与set与Java中的get,set有很大的差异:
在Scala中,如果程序中给变量或方法前面定义了private,那么scala会给这个变量或方法自动生成private的get和set方
法,如果程序中没有给变量或方法前面定义了private,那么scala会给这个变量或方法自动生成public的get和set方法。
创建类的对象
val scal = new Hiscala scal.sayName() scal.sayName//如果不传参时,等同上面 scal.getName var name="Spark" //如果不加private,默认会生成一个public的get和set方法,外部可以调
private[this] 对类对象较深层次的访问控制
类的构造器
注意:所有重载的构造器,都必须首先调用默认的构造器,或者说调用其它重载的构造器
类的构造器:重载
def this(name:String){ this() //调用默认的构造器 this.name=name } def this(name:String,age:Int){ this(name) //调用其它重载的构造器 this.age=age }
伴生对象 object:
scala程序中,定义完类之后,一般会定义一个同名的object,它用于存放静态的成员或者方法,当我们第一次调
用这个伴生对象时,它会执行object的构造方法,只是这个构造方法是不接受参数的,而且这个构造方法只会调用一次,以后不会
在调用。
定义:
object Person{ println("Scala") val salary=0.0 def getSalary=salary }伴生对象的apply方法:它就是当前类的对象的工厂方法,它可以控制对象的生成。
scala不支持多重继成
trait:工具方法的一个容器
val array = Array(1,2,3)//调用Array的伴生对象
scala类的定义 class HiScala{//默认是public级别的 private var name="Spark"//成员变量 def sayName(){ println(name) } def getName = name } val scala = new HiScala() scala.sayName()//没有参数可以省略()scala.sayName scala.getName class Person { private var myName = "Flink" def name = this.myName def name_=(newName : String){ myName = newName println("Hi" + myName) } } val rocky = new Person rocky.name rocky.name = "Spark" class Person { private var myName = "Flink" def name = this.myName def update(newName : String){ myName = newName println("Hi" + myName) } } //rocky.name报错了 rocky.update("Hadoop") class Person { private var myName = "Flink" def name = this.myName def update(newName : String){ myName = newName println("Hi" + myName) } def talk(p:Person) = { println("Hello!" + p.name) } } val p1 = new Person val p2 = new Person p2.update("Spark") p1.talk(p2) class Person { private[this] var name = "Flink" //本对象独有,另外一个Person对象也访问不到 def update(newName : String){ println("Hi:") } def talk(p:Person) = { println("Hello!" + p.name)//这里会报错 } } //构造函数 class Person(config : SparkConf) extends Logging//与类名并行的是默认构造器 class Person{ var name = "" var age = 0 def update(newName : String){ println("Hi:") } def this(name : String){ this() this.name = name } def this(name : String,age : Int){ this() this.name = name this.age = age } } //伴生对象 class Person{ var name = "" var age = 0 def update(newName : String){ println("Hi:") } def this(name : String){ this() this.name = name } def this(name : String,age : Int){ this() this.name = name this.age = age } } object Person{ println("Scala") var salary = 0.0 def getSalary = salary } Person.getSalary val array = Array(1,2,3)//调用Array的伴生对象
第二部分作业
RDD类源码解析:
class RDD它是个抽象类
private[class_name] 指定可以访问该字段的类,访问的级别较严,在编译时,会自动的生成get和set方法,class_name必须是当前定义的类或类的外部类。
private[spark] def conf = sc.conf
class RDD类中有很多加了final修饰符的方法,表示:此方法或属性,子类继承此类时不可被覆写,如下:
final def dependencies: Seq[Dependency[_]] = { checkpointRDD.map(r => List(new OneToOneDependency(r))).getOrElse { if (dependencies_ == null) { dependencies_ = getDependencies } dependencies_ } } /** * Get the array of partitions of this RDD, taking into account whether the * RDD is checkpointed or not. */ final def partitions: Array[Partition] = { checkpointRDD.map(_.partitions).getOrElse { if (partitions_ == null) { partitions_ = getPartitions } partitions_ } } final def getNumPartitions: Int = partitions.length
创建sarpkContext唯一需要的参数就是sparkConf。它是一组K-V属性对
class SparkContext(config: SparkConf)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)) /** * Alternative constructor that allows setting common Spark properties directly * * @param master Cluster URL to connect to (e.g. mesos://host:port, spark://host:port, local[4]). * @param appName A name for your application, to display on the cluster web UI. * @param sparkHome Location where Spark is installed on cluster nodes. * @param jars Collection of JARs to send to the cluster. These can be paths on the local file * system or HDFS, HTTP, HTTPS, or FTP URLs. * @param environment Environment variables to set on worker nodes. */ 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)) this.preferredNodeLocationData = preferredNodeLocationData }
val startTime = System.currentTimeMillis()
startTime没有加上private,scala编译时,startTime这个变量是私有的,但会自动的生成它的public的get和set方法,供外部对象调用。
private[spark] val stopped: AtomicBoolean = new AtomicBoolean(false)
private def assertNotStopped(): Unit = {}