0


《Spark大数据技术与应用》肖芳 张良均著——课后习题

目录


教材

《Spark大数据技术与应用》肖芳 张良均著


知识汇总+课后习题

第一章 Spark概述

Spark的特点

  1. 快速
  2. 易用
  3. 通用
  4. 随处运行
  5. 代码简洁

Spark生态圈

  1. Spark Core 提供底层框架和核心支持
  2. BlinkDB 用于海量数据上运行交互式SQL查询的大规模并行查询引擎
  3. Spark SQL
  4. Spark Streaming 流式计算
  5. MLBase
  6. MLlib 数据挖掘算法库
  7. GraphX 图计算
  8. Spark R

Spark应用场景

  1. 腾讯
  2. Yahoo
  3. 淘宝
  4. 优酷土豆

第二章 Scala基础

Scala的特性

  1. 面向对象
  2. 函数式编程
  3. 静态类型
  4. Scala是可扩展的

val是常量

val name:type= initialization

var是变量

var name:type= initialization

运算符
在这里插入图片描述
在这里插入图片描述


数组

var z:Array[String]=new Array[String](num)
或
var z=Array(元素1, 元素2, ……)

Scala列表与数组非常相似,列表的所有元素都具有相同的类型。

与数组不同的是列表不可变,也就是说列表内的元素不能通过赋值来更改。

在这里插入图片描述如果需要合并两个列表,可以使用”:::”三个冒号表示。

基本操作方法
基本操作描述arr.length返回数组的长度arr.head查看数组的第一个元素arr.tail查看数组中除了第一个元素外的其他元素arr.isEmpty判断数组是否为空arr.contains(x)判断数组是否包含元素x
在这里插入图片描述


匿名函数

匿名函数是使用箭头”⇒”定义的,头的左边是参数列表,箭头右边是表达式,表达式产生函数的结果。

但在考试中也许是这样使用。

如果函数的每个参数在函数中最多出现一次,则可以使用占位符“_”代替参数。

可以把这里的占位符当作需要填入的空白,也就是上一条的x和y。

scala>(x:Int, y:Int)=>x+y
scala>val addInt =(x:Int, y:Int)=> x+y
scala>val addInt =(_:Int)+(_:Int)

Set

没有重复对象的集合

scala>val set:Set[Int]=Set(参数1, 参数2, ……)

Map

映射是一种可迭代的键值对结构,所有值都可以通过键来获取,并且Map中的键都是唯一的。

scala>val person:Map[String,Int]=Map("John"->21,"Betty"->20)

关键点在

函数组合器

函数描述map(func)对RDD数据集中的每个元素都使用func,返回一个新的RDDfilter(func)对RDD数据集中的每个元素都是用func,返回func为true的元素构成RDDflatMap(func)和map类似,但是flatMap生成的是多个结果union(otherDataset)返回一个新的dataset,包含源dataset和给定的dataset的元素的集合groupByKey(func)返回(K, Seq[V]),根据相同的键分组reduceByKey(func, [num Taskk])用一个给定的func作用在groupByKey而产生的(K, Seq[V]),比如求和

map

通过一个函数重新计算列表中的所有元素,并且返回一个相同数目元素的新列表。直接看样例:

scala>val num = List(1,2,3,4,5)

scala> num.map(x => x * x)

在这里插入图片描述

这里使用到了匿名函数,代码解释为:常量val列表内的信息,将其进行匿名函数处理,它原先的值相乘。也就是说,11,22,3*3……。这里只是初级使用,一定要先了解这一步!考试的时候一定会有题目考到要使用map的情况!

过滤函数。

scala>val num:List[Int]= List(1,2,3,4)

scala> num.filter(x => x %2==0)

在这里插入图片描述

其使用方法相当于if条件判断,只不过将其变得更为简洁。当然使用起来还可以结合map。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qs9Q2p1q-1671328987871)(Manage%20Self%20b6439b2383b64d689578e2730484a1a4/%E8%87%AA%E4%B9%A0%E5%AE%A4%E9%A2%84%E5%AE%9A%E7%B3%BB%E7%BB%9F%203c883dc3f540469785e331bd6ea62ac0/Untitled%20Database%20f6e88f7c61c84039a91b316368760414/%E5%AF%92%E5%81%87%E6%9C%9F%E6%97%A5%E7%A8%8B%E8%A7%84%E5%88%92%208c7d608d795a4843ae5923a5fbf45056/Untitled%20Database%20e32797b427e542edb000b09d8747fbf4/Spark%E6%80%BB%E5%A4%8D%E4%B9%A0%204472c67e80534cb794a4e0d89344d46e/Untitled%202.png)]

flatMap

将多维数组或列表进行扁平化。

在这里插入图片描述

groupBy

分组聚合,得到的结果是Map类型。

scala>val num = List(1,2,3,4,5,6,7,8,9,10)

scala> num.groupBy(x => x %2==0)

在这里插入图片描述


课后习题

  • 选择题在这里插入图片描述在这里插入图片描述
  • 编程题水仙花数是指其个位、十位、百位3个数的立方和等于这个数本身,请用Scala变成求出所有水仙花数。for(n <-100 to 999){val b = n /100// 百位val s = n %100/10// 十位val g = n %100%10// 个位if(b * b * b + s * s * s + g * g * g == n){ println(n);}}

在这里插入图片描述


第三章 Spark编程

RDD的创建与使用

RDD是一种容错的、只读的、可进行并行操作的数据结构

创建:

makeRDD

在这里插入图片描述

CSV文件的读取也可以这样读,不用按照书上描述的写。

从HDFS创建RDD
// HDFS下的文件val file = sc.textFile("hdfs://主机名:9000/文件目录")// Linux下的文件val file = sc.textFile("file:///文件目录")

文件的存储

rdd名称.saveAsSequenceFile("保存路径")// 或

rdd名称.saveAsTextFile("保存路径")

教材52页任务3.2及之后的任务

重点复习

sortBy排序
  • 参数1,左边是要被排序对象中的每一个元素,右边返回的值是元素中要进行排序的值
  • 参数2,默认为true(升序),false(降序)
  • 参数3,排序后的分区个数

collect查询

distinct去重

zip

将两个RDD组合成Key / Value形式,这两个RDD的partition数量以及与元素数量必须都相同。


简单的集合操作
方法描述简述intersection( )参数是RDD,求出两个RDD的共同元素交集union( )参数是RDD,合并两个集合的所有元素并集subtract( )参数是RDD,将原RDD和参数RDD的相同元素去掉补集cartesian( )参数是RDD,求两个RDD的笛卡尔积笛卡尔积


实训题

实训1

统计性别为“男”的用户

在这里插入图片描述

//分开处理val rdd = sc.textFile("file:///opt/test.txt")

rdd.collect // 在考试时可写,可不写val rdd2 = rdd.map(_.split(",")).filter(_.contains("男"))

rdd2.count

在这里插入图片描述

// 统合处理
sc.textFile("file:///opt/test.txt").map(_.split(",")).filter(_.contains("男")).count

在这里插入图片描述

实训2

单词计数
在这里插入图片描述

//分开处理val rdd = sc.textFile("file:///opt/words.txt")

rdd.collect // 在考试时可写,可不写val rdd2 = rdd.flatMap(_.split("\\w+")).map((_,1)).reduceByKey(_+_,1)val rdd3 = rdd2.filter(_._2 >3)

rdd3.saveAsSequenceFile("HDFS路径")
// 统合处理
sc.textFile("file:///opt/words.txt").flatMap(_.split("\\w+")).map((_,1)).reduceByKey(_+_,1).filter(_._2 >3).saveAsSequenceFile("HDFS路径")

选择题

在这里插入图片描述
在这里插入图片描述

编程题

地名次数

```scala
//分开处理
val rdd = sc.textFile("file:///opt/users.csv")

val rdd2 = rdd.map(_.split(",")).map(x => (x(1), 1))

rdd2.reduceByKey(_+_).collect

![在这里插入图片描述](https://img-blog.csdnimg.cn/ab9a89bcd3b8437c8d4553728a2524bf.png)

//统合处理
sc.textFile("file:///opt/users.csv").map(.split(",")).map(x =>(x(1),1)).reduceByKey(+_).collect


将结果保存……
![在这里插入图片描述](https://img-blog.csdnimg.cn/52887d8362fe43179e8d0bb9508a4f85.png)

---

## 第四章 Spark编程进阶

![在这里插入图片描述](https://img-blog.csdnimg.cn/70e75de3e72a4674b529fb9f396330d4.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/a169e3d0ff3a42c291c5a9196253f896.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/ae1a6950ba0e49a0b625436a501603f4.png)

---

## 第五章 Spark SQL:结构化数据文件处理

基本的MySQL命令操作

DataFrame查询操作两种方式

1. 将DataFrame注册称为临时表,然后通过SQL语句进行查询
2. 直接在DataFrame对象上进行查询。

## 课后习题

### 选择题

![在这里插入图片描述](https://img-blog.csdnimg.cn/e7189197db27434e86d93726d7e1b1b2.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/6fa82683b3b448f1b06a7a91509229f8.png)

### 操作题

用户播放歌曲次数
![在这里插入图片描述](https://img-blog.csdnimg.cn/d483504ae65546fbaf1eaba2bfe2fd5c.png)

caseclass userList(userid:Int, artistid:Int, count:Int)// 创建用例类val user_artist_data = sc.textFile("file:///opt/user_artist_data.txt").map{x =>val y = x.split(" "); userList(y(0).toInt, y(1).toInt, y(2).toInt)}.toDF();

user_artist_data.createOrReplaceTempView("user_artist")

spark.sql("select userid, count(distinct artistid) from user_artist group by userid").show()

spark.sql("select artistid, count from user_artist where userid=1000002 oder by count desc limit 10").show()

```


第六章 Spark Streaming:实时计算框架

课后习题
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

标签: spark 大数据 scala

本文转载自: https://blog.csdn.net/m0_63042291/article/details/128361000
版权归原作者 土豆~ 所有, 如有侵权,请联系我们删除。

“《Spark大数据技术与应用》肖芳 张良均著——课后习题”的评论:

还没有评论