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

关于

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

原文地址:https://www.cnblogs.com/dt-zhw/p/5700788.html