1939 2

第3课:Scala函数式编程彻底精通及Spark源码阅读 [推广有奖]

  • 1关注
  • 8粉丝

硕士生

34%

还不是VIP/贵宾

-

威望
0
论坛币
305 个
通用积分
0
学术水平
5 点
热心指数
14 点
信用等级
2 点
经验
23002 点
帖子
73
精华
0
在线时间
135 小时
注册时间
2016-2-27
最后登录
2016-9-11

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

  函数式编程是scala的最大魅力之所在,在函数式编程语言中,函数是“头等公民”,可以像任何其他数据类型一样被传递和操作。因为Scala混合了面向对象和函数式的特性,所以对Scala来说,函数是“头等公民”。函数可以不依赖于类、对象或者接口而单独存在,函数可以作为函数的参数或作为函数的返回值。使用函数式编程可以简化复杂算法,并且代码量更少。Spark中的所有计算基本上都是用函数式编程来做的。


一、作为值的函数

O(4O9QGU`PDUU09V)~U[D`1.png

fun的类型是(Double)=>Double,意为接受Double参数并返回Double的函数。能够对fun做的有:调用,传递。fun调用:

8DJ}SU4P5DTNK[]IY0X$@JV.png


scala>def fun1(name:String){println(name)}

fun1:(name: String)Unit


scala>val fun1_v = fun1 _

fun1_v:String => Unit = <function1>


scala>fun1_v("hello func")

hellofunc


可以将函数赋值给变量


二、匿名函数

为了算法的简洁性我们可能不需要函数的名称,只需要函数体对我们输入的数据进行处理,这个时候就不需要为函数命名。

%DSWCAZ97U]A(HMR`ZP]]%9.png


fun2是一个变量,函数的参数是String类型,返回类型时Unit。fun2中的=>符号可以看做是创建函数实例的语法糖。例如:A => TA,B => T表示一个函数的输入参数类型是“A”,“A,B”,返回值类型是T。上述定义的匿名函数,其实是下面这种写法的简写:

JXT2NBZRYA[)7A(W5ML0]NR.png

备注:任何函数值都是某个扩展了scala包的若干个FunctionN特质之一的类的实例,如Function0是没有参数的函数,Function1是有一个参数的函数等等。每个FunctionN特质有一个apply方法来调用函数。

  1. trait Function2[@specialized(scala.Int, scala.Long, scala.Double) -T1, @specialized(scala.Int, scala.Long, scala.Double) -T2, @specialized(scala.Unit, scala.Boolean, scala.Int, scala.Float, scala.Long, scala.Double) +R] extends AnyRef { self =>
  2.   /** Apply the body of this function to the arguments.
  3.    *  @return   the result of function application.
  4.    */
  5.   def apply(v1: T1, v2: T2): R
  6.   /** Creates a curried version of this function.
  7.    *
  8.    *  @return   a function `f` such that `f(x1)(x2) == apply(x1, x2)`
  9.    */
  10.   @annotation.unspecialized def curried: T1 => T2 => R = {
  11.     (x1: T1) => (x2: T2) => apply(x1, x2)
  12.   }
  13.   /** Creates a tupled version of this function: instead of 2 arguments,
  14.    *  it accepts a single [[scala.Tuple2]] argument.
  15.    *
  16.    *  @return   a function `f` such that `f((x1, x2)) == f(Tuple2(x1, x2)) == apply(x1, x2)`
  17.    */

  18.   @annotation.unspecialized def tupled: Tuple2[T1, T2] => R = {
  19.     case Tuple2(x1, x2) => apply(x1, x2)
  20.   }
  21.   override def toString() = "<function2>"
  22. }
复制代码



三、带函数参数的函数(高阶函数)

_T$AJSWK3OK)BGX}KM]O2.png

Rdd中的map方法:

  1. def map[U: ClassTag](f: T => U): RDD[U] = withScope {
  2.   val cleanF = sc.clean(f)
  3.   new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))

  4. }
复制代码


函数的函数的返回值是一个函数:

Q)G@PH90HL[8WFK[Z~{C3(4.png


9RO9}W`IOBNYVR86CZE4ENW.png


Scala集合库提供的高阶函数map、zip、flatMap:

9`%YR`QATWVNZ2[Z@~4AAFF.png



YR9F]P{~XO5V~@K~JS926]D.png



LVCLM_Z`({E_E2OGC9F6D88.png



SWT2AHPW3Z50S[D[]6RQ}(3.png


高阶函数的变换:

scala> def spark(func: (String) =>Unit, name: String) = func(name)

spark: (func: String => Unit, name:String)Unit


scala> spark((name:String) =>println(name) , "spark")

spark


scala> spark( name => println(name) ,"spark")  //scala类型推断去掉参数类型

spark


scala> spark(println(_),"spark")  //只有一个参数,用下划线代替

spark


scala> spark(println _,"spark") //部分应用函数,可以使用单个下划线替换整个参数列表

spark


scala> spark(println, "spark")   //只有一个参数,可以省略

Spark


scala> (1 to 3) map( _ * 2)

res8:scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4, 6)


四、闭包

HWR{5$AGGGS2NZSRIMSQM99.png

这里addMore 函数捕获了外部变量more。

五、柯里化(Currying

1)柯里化指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数作为参数的函数。

NDI{16DTN{D22KQ%1@IU9]K.png

scala> def sum_Currying(x: Int) = (y:Int) => x + y

sum_Currying: (x: Int)Int => Int


scala> sum_Currying(45)(4)

res15: Int = 49


通过柯里化变成了两个函数的连续调用,可以看做链式的过程。


2)可以利用柯里化把某个函数参数单独拎出来,提供更多用于类型推断的信息。

]CQ$Y3(_DLU[$_N%P[__OPI.png



注:本学习笔记来自DT大数据梦工厂

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:SCALA Spark SPAR Park SPA Spark scala DT_Spark 大数据

A345~@J`}8D2SCMH4W1SCXY.png (6.11 KB)

A345~@J`}8D2SCMH4W1SCXY.png

_CXA(S`Y)H[6SK%5N}]A~33.png (8.49 KB)

_CXA(S`Y)H[6SK%5N}]A~33.png

$5UMBVXE`XNPAA_2%GQHJ)3.png (4.78 KB)

$5UMBVXE`XNPAA_2%GQHJ)3.png

WDZS1LVGF97H_MC8O{B)L}4.png (6.4 KB)

WDZS1LVGF97H_MC8O{B)L}4.png

`[HSLX1D8C}@Y`E04]XJEGV.png (4.78 KB)

`[HSLX1D8C}@Y`E04]XJEGV.png

ZV`@[`336MWGCRNKPA2AD1U.png (5.85 KB)

ZV`@[`336MWGCRNKPA2AD1U.png

)}_`W9%H6)(FVXHP`FEB}ZS.png (5.2 KB)

)}_`W9%H6)(FVXHP`FEB}ZS.png

2_NS6451_H49U`9_AGFKCNX.png (7.54 KB)

2_NS6451_H49U`9_AGFKCNX.png

2I9M)875@W_JKNL9W6ZV5U4.png (6.02 KB)

2I9M)875@W_JKNL9W6ZV5U4.png

K35%3%H$)JFY~~A6WEBY9U9.png (5.32 KB)

K35%3%H$)JFY~~A6WEBY9U9.png

9WZOAE7I}A9}SS[YV$%AO4R.png (5.4 KB)

9WZOAE7I}A9}SS[YV$%AO4R.png

%IPC2WSQR%XB}}S4A(T[IT3.png (5.16 KB)

%IPC2WSQR%XB}}S4A(T[IT3.png

ZO62M0@(}M07{P]20@JJ$_L.png (2.31 KB)

ZO62M0@(}M07{P]20@JJ$_L.png

X3KDC7UPQS5B7_SQFBERE%J.png (2.92 KB)

X3KDC7UPQS5B7_SQFBERE%J.png

已有 1 人评分经验 论坛币 收起 理由
daazx + 60 + 20 精彩帖子

总评分: 经验 + 60  论坛币 + 20   查看全部评分

沙发
daazx 在职认证  发表于 2016-3-25 19:12:12 |只看作者 |坛友微信交流群
开个系列?

使用道具

daazx 发表于 2016-3-25 19:12
开个系列?
yes,专攻Spark和机器学习!{:2_26:}

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 15:39