Spark小课堂Week5 Scala初探

Spark小课堂Week5 Scala初探

Scala是java威力加强版。

对Java的改进

这里会结合StreamingContext.scala这个代码说明下对Java的改进方面。

  • 方便测试方式,增加了可以指定位置的作用域。
  • 成员变量声明,构造方法,get、set方法一体化。
  • []表示泛型,不是<>
class StreamingContext private[streaming] (

 sc_ : SparkContext,

 cp_ : Checkpoint,

batchDur_ : Duration

) extends Logging
  • case声明Java Bean,省掉new的操作
private[scheduler] sealed trait JobSchedulerEvent

private[scheduler] case class JobStarted(job: Job, startTime: Long) extends JobSchedulerEvent
  • 用val控制声明周期,防止他人重新构造,已将所有基本类型对象化,所以val内容是可变的
  • 提供类型推断,对于编译器可推断类型无需定义
private[streaming] val isCheckpointPresent = (cp_ != null)
  • 会自动根据分支的最后一个逻辑返回,不需要return,可以表达式来定义逻辑
private[streaming] var checkpointDir: String = {

 if (isCheckpointPresent) {

 sc.setCheckpointDir(cp_.checkpointDir)

cp_.checkpointDir

} else {

null

}

}
  • 用None替代null,由定义方来定义是否可能空指针情况,降低调用方的开发难度
private[streaming] val uiTab: Option[StreamingTab] =

if (conf.getBoolean("spark.ui.enabled", true)) {

Some(new StreamingTab(this))

} else {

None

}

作业

题目

在RDD.scala中没有sortByKey方法,为什么可以调用。

解析

Scala中有一个非常强大的隐式转换功能,可以实现方法的动态注入。

以下是范例代码。可以看到通过隐式转换方法,可以动态给Person类添加toCode这个方法。

在Spark源码中到处使用。

class Person(val name:String)
class Engineer(val name:String,val salary:Double){
def code = println("coding:" + name)
}
def toCode(p:Person){
p.code
} implicit def personToEngineer(p:Person) : Engineer= {
new Engineer(p.name,0);
}
new Person("aa").code

关于

小课堂是在公司进行内部交流的一系列主题,偏基础,但是比较零散,持续更新中。

上一篇:经典SQL练习题


下一篇:[Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.3.7