您的位置:首页 > 大数据

大数据系列第三课:scala中阶

2016-01-04 07:04 543 查看
第一阶段:Spark streaming、spark sql、kafka、spark内核原
理(必须有一个大型项目经验);

第二阶段:spark运行的各种环境,各种故障的解决,性能 优化(精通spark内核、运行原理);

第三阶段:流处理、机器学习为鳌头,需要首先掌握前两个 阶段的内容;

跟随王家林老师的零基础讲解,注重动手实战,成为spark高手,笑傲大数据之林!

第一部分:学习笔记

本期内容:

1 Scala中函数式编程彻底详解

2 Spark源码中的Scala函数式编程

3 案例和作业

一、函数、高阶函数

1、最基础函数,函数不依赖类、对象,可以作为一等公民进行赋值。

def fun1(name:String){println(name)}
val fun1_v = fun1 _
fun1("Spark")

2、匿名函数:参数名称 =(参数:类型)=> 函数体

一般会将匿名函数赋值给一个变量。

val fun2 = (content:String) =>println(content)
fun2("Hadoop")

3高阶函数: (1)函数参数也是函数(函数作为一等公民可以赋值给变 量,也可以作为函数的参数)

(2)高阶函数返回值也有可能为函数

val hiScala = (content:String) =>println(content)
//定义函数
def bigData(func:(String) =>Unit,content:String){func(content)}
//第一个参数是一个String类型字符串,返回类型Unit
bigData(hiScala,"Spark")
//调用函数
val array =Array(1,2,3,4,5,6,7,8,9)
array.map(item =>2*item)
array.map(item =>println(item))
//打印出1到9


4、高阶函数返回值也有可能为函数

def func_Returned(content:String) = (message:String) =println(message)
//func_Returned本身返回字符串类型
func_Returned("Spark")
res:String =>Unit = <function1>
//输入类型Strin,返回Unit =function1 为一个函数
val returned = func_Returned("Spark")
returned("Scala")

高阶函数可以自动推导出参数的类型,在函数的作用的函数体内只使用一次函数输入参数值,我们可以将输入函数的名称省略掉,用“_”代替。

def  spark(func:(String) =>Unit,name:String){func(name)}
//调用第一个参数(函数func),第二个参数为String(name)
spark((name:String) =>println(name),"Scala")
spark(println(_),"Scala")
//只用一个参数的话,可以省略()
spark(println _,"Scala")  		//必须有空格
spark(println,"Scala")
array.map(2*_)
array.map(2*_).foreach(println(_))
//只有一个元素,可以省略(),下面两个等价
array.map(2*_).foreach(println _)
array.map(2*_).foreach(println)
array.map(2*_).filter(_ >10).foreach(println)

二、闭包

Scala为我们当前的对象隐式生成一个对象,此对象可以重新再传入使用。

//定义函数,闭包的形式
def scala(content:String) = (message:String) =>println(content+":"message)
val func3 = scala("Spark")
func3("Flink")
//Spark作为content传入值,依旧可以传入值Flink

三、Curring

1、Curring的函数被应用于多个参数列表,而非仅仅一个

def plainOld(x:Int,y:Int) =x+y
def plainOld(x:Int)(y:Int) =x+y
<p>plainOld(1)(3)  //<span style="font-family:宋体;">调用函数</span></p>

这里当我们调用plainOld时,实际上连接调用了两个传统函数,第一个函数调用带单个的名为x的Int参数,并返回第二个函数的函数值,第二个函数带Int参数y.。

四、List集合操作

从集合list的角度讲,包含flatmap、map、filter、zip、listBuffer等(immutable,mutable)的操作。

(immutable,mutable)的操作
val list = List("Scala","Spark","Flink")
val call =list.map("The content is :" + _)
list.map(println)
call.flatmap(_.split(" "))  //以空格进行切分,返回List[String]
call.flatmap(_.split(" ")).foreach(println)  //遍历打印切分后的List
list.zip(List(10.4.6))      //进行拉链操作,返回List[(String,Int)]
1 to 100

第二部分:作业

统计一个目录下所有单词出现的总次数

import scala.io.Source
import java.io._
import scala.collection.mutable
/**
* @author css-kxr
*/
class DT_my3 {

//通过aggregate来实现map reduce,效率更高
val lines = Source.fromFile("c:/hello.txt").getLines()foreach(println)
val seqop = (result: mutable.HashMap[String, Int], line: String) => {
val wordcount = line.replace(",", " ").replace(".", " ").replace("(", " ").replace(")", " ").split(" ").filter(_.trim.length > 0).map(word => (word, 1))
wordcount.foreach(count => {
val addOne = (count._1, result.getOrElse(count._1, 0) + count._2)
result += addOne })
result
}
val combop = (result1: mutable.HashMap[String, Int], result2: mutable.HashMap[String, Int]) =>result1 ++= result2
val test = lines.aggregate(mutable.HashMap[String, Int]())(seqop, combop)
println(test)
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: