Scala语言基础之结合demo和spark讲实现链式计算

Posted 浪尖聊大数据

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala语言基础之结合demo和spark讲实现链式计算相关的知识,希望对你有一定的参考价值。

一,什么是链式计算

1,一般开发习惯把事情封装到一个方法中;链式编程思想是把要做的事情封装到block中,给外部提供一个返回这个block的方法

2,链式编程思想方法特点:方法的返回值必须是blockblock的参数是需要操作的内容,block的返回值是返回这个block的方法的调用者

二,举例说明

比如我们定义个case class Person

case class Person(private val parent: Person = null ,private val name: String = null , private var age: Int = 0 ) {
  def setName(newName: String) = new Person( this,newName, this.age )
  def setAge(newAge: Int) :this.type = {
    this.age = newAge;
    this
  }
  def introduce {parentIntroduce; println( s"Hello, my name is $name and I am $age years old." ) }
  def parentIntroduce { if(parent!=null)parent.introduce }
}

那么,我们可以执行下面操作:

Person(null,"kitty",45) .setName("Peter").setAge(41).setName("Peter1").setAge(21).introduce

执行的结果

Hello, my name is kitty and I am 45 years old.
Hello, my name is Peter and I am 41 years old.
Hello, my name is Peter1 and I am 21 years old.

其实,我这里是有个陷阱,比如我现在换一种顺序调用(第一次调用setAgesetName互换),如下:

Person(null,"kitty",45) .setAge(41).setName("Peter").setName("Peter1").setAge(21).introduce

那么结果就会变成下面的样子:

Hello, my name is kitty and I am 41 years old.
Hello, my name is Peter and I am 41 years old.
Hello, my name is Peter1 and I am 21 years old.

三,总结

之所以会出现上面两种结果,是由于我们的setAge操作是执行之后返回的是对象本身,而setName操作又重新new 了一个对象。

由此,我们可以类比到RDD的操作。之前,群友问过这样一个问题:

RDD.repartiton(12)

RDD的分区为啥不变成12呢?

实际上是由于RDD的所有转换算子都是新生成了一个RDD,而不是将函数作用于自身。

其实,还有一种链式计算的实现方式是执行函数返回的是一个固定的类型,而不一定是调用者自身或者同父类的实现对象。比如,Dataset最终执行的实现函数的返回就是固定类型:RDD[InternalRow],而不是Dataset。这点后面会详细介绍。



以上是关于Scala语言基础之结合demo和spark讲实现链式计算的主要内容,如果未能解决你的问题,请参考以下文章

Spark 入门之 Scala 语言解释及示例讲解

scala实战之spark用户在线时长和登录次数统计实例

Spring boot结合Kafka的Demo

Spark 体验 - 使用Ide开发基于Scala语言的spark demo

Hadoop 之 Spark 安装配置与示例

spark教程-入门与安装