专栏首页Spark学习技巧Scala语言基础之结合demo和spark讲实现链式计算

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

一,什么是链式计算

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

2,链式编程思想方法特点:方法的返回值必须是block,block的参数是需要操作的内容,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.

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

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。这点后面会详细介绍。

本文分享自微信公众号 - Spark学习技巧(bigdatatip),作者:浪尖

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spark 如何摆脱java双亲委托机制优先从用户jar加载类?

    spark的类加载及参数传递过程还是很复杂的,主要是因为他运行环境太复杂了,不同的集群管理器完全不一样,即使是同一集群管理器cluster和client也不一样...

    Spark学习技巧
  • hive安装部署

    1、 准备环境 1, 软件准备 Java-- jdk-8u121-linux-x64.tar.gz Hadoop--hadoop-2.7.4.tar.gz (j...

    Spark学习技巧
  • Flink与Spark Streaming在与kafka结合的区别!

    本文主要是想聊聊flink与kafka结合。当然,单纯的介绍flink与kafka的结合呢,比较单调,也没有可对比性,所以的准备顺便帮大家简单回顾一下Spark...

    Spark学习技巧
  • Implement CGLIB in ABAP

    What is cglib?A Byte Code Generation Library which is high level API to generate...

    Jerry Wang
  • python Class:获取对象类型

    #!/usr/bin/env python3 # -*- coding: utf-8 -*-

    py3study
  • 如何分析SAP UI5应用的undefined is not a function错误

    Recently I meet with an annoying Javascript error “undefined is not a function” ...

    Jerry Wang
  • 利用mybatis-generator自动生成代码

    <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-...

    用户5640963
  • Kotlin 's Function 《Kotlin极简教程》正式上架:

    Functions are declared using the fun keyword, followed by a function name and an...

    一个会写诗的程序员
  • 如何让 Mybatis 自动生成代码,提高开发效率

    还好, mybatis 为我们提供了强大的代码生成--MybatisGenerator。

    JAVA葵花宝典
  • django filter过滤器实现显示某个类型指定字段不同值方式

    不设置时默认设置为False。设置为True时,数据库表字段中将存入NULL的记录。 null和blank组合使用,null=True,blank=True,表...

    砸漏

扫码关注云+社区

领取腾讯云代金券