一、填空
1. Spark Web监控页面的端口地址是_______localhost:4040__________
2. 在Spark安装目录下的conf目录中,修改名为_log4j.properties__配置文件,可以避免Spark程序在运行时输出过多的信息
3. 启动基于Python的Spark交互式命令行的命令是______pyspark__________
4. Spark Core提供了Spark最基础与最核心的功能,它的子框架包括___Spark SQL____、____Spark Streaming_______、______MLlib_____、___GraphX_____
5. 调用cache()方法进行持久化操作时,执行的持久化级别是______MEMORY_ONLY_____
6. 算子可以分为____transform(转换)___算子和____action(执行)_____算子两大类。
7. 图有_______有向图________和________无向图_______构成
8. 顶点DataFrame必须包括列名为____“id”_____的列,以作为顶点的唯一标识。边DataFrame必须包含名为”src”____和__”dst”__列,以作为起点和终点的唯一标识。
9. 计算两个RDD交集的算子是____intersection()_____
10. 下图的强连通分量有____2____个。顶点d的度是________4_____,入度是______2_________,出度是_____2________
二、判断
1. 图可以只有顶点,没有边(√)
2. Spark的底层是使用Scala编程语言编写的 (√)
3. RDD Transformation算子的返回值一定是RDD (√)
4. DataFrame无法转换到RDD (×)
5. GraphFrames库不是Spark项目自带的,需另外安装。安装时无需考虑GraphFrames的版本问题 (×)
6. RDD和DataFrame的区别之一是,后者具备Schema (√)
7. Transformation算子都是懒执行,如果不调用Action算子就不会执行 (√)
8. RDD对象都是只读的 (√)
9. Spark SQL是Spark用来操作结构化或者半结构化数据的组件 (√)
三、计算
1. sc.parallelize([1, 2, 3, 4, 5]).filter(lambda x : x%2 == 0).collect()的运行结果是____[2,4]____
2. sc.parallelize([1, 2, 3, 4, 6, 7, 8]).top(3)的运行结果是____[8,7,6]_____
3. sc.parallelize([1, 2, 3, 4, 6, 7, 8]).take(3)的运行结果是___[1,2,3]______
4. 已知:tmp = [('a', 1), ('b', 2), ('1', 3), ('d', 4), ('2', 5)],那么:
sc.parallelize().sortBy(lambda x: x[1],False).collect()的运行结果是
_[('2', 5), ('d', 4), ('1', 3), ('b', 2), ('a', 1)]
5. sc.parallelize([('a', 1), ('b', 2), ('a', 3),]).groupByKey().mapValues(list).collect()的运行结果是_____[('a', [1, 3]), ('b', [2])]
6. sc.parallelize([(1, 2), (3, 4)]).keys().collect()的运行结果是_____[1,3]_______
7. sc.parallelize([(1, 2), (3, 4)]).values().collect()的运行结果是_______[2,4]________
8. sc.parallelize([1, 2, 3, 4, 5]).reduce(add) 的运行结果是_________15___________
9. sc.parallelize([4, 6, 8, 2, 9]).takeOrdered(2)的运行结果是________[2,4]______________
10. sc.parallelize([10, 4, 2, 12, 3]).first() 的运行结果是_______10_______________
11. sc.parallelize([("a", 1), ("b", 1), ("a", 1)]).countByKey()的运行结果是_____defaultdict(int, {'a': 2, 'b': 1})__________
12. 已知:rdd1 = sc.parallelize([1, 10, 2, 3, 4, 5]),
rdd2 = sc.parallelize([1, 6, 2, 3, 7, 8])
那么,rdd1.intersection(rdd2).collect()的运行结果是_____[1,2,3]____________
13. 已知list01 = ["what is your name", "my name is john", "nice to meet you"]
(1)请通过RDD编程计算list01中各个元素的长度。并通过图示画出RDD的转换过程。
sc.parallelize(list01).map(lambda x : len(x)).collect()
x | map → | Len(x) |
"what is your name" | 17 | |
"my name is john" | 15 | |
"nice to meet you" | 16 |
(2)请通过RDD编程计算list01中各个元素中各个单词的长度。并通过图示画出RDD的转换过程。
sc.parallelize(list01).flatMap(lambda x: x.split(' ')).map(lambda x : len(x)).collect()
14. 已知data = [("001", "张明", 83, "河南"), ("002", "李四", 91, "山西"), ("003", "王五", 95, "河南"), ("004", "赵柳", 76, "河北")]
数据一共分为 4列,每一列的列名和含义如下表所示:
列名 | id | name | score | province |
含义 | 学号 | 姓名 | 分数 | 省份 |
请通过DataFrame API和SparkSQL分别编程:
(1)过滤出分数大于90的学生,并按分数由高到低显示。
df01.filter('_3>90').orderBy('_3',ascending = False).show()
df01.registerTempTable('df01_table')
sqlContext=SparkSession.builder.getOrCreate()
sqlContext.sql("select * from df01_table where _3>90 order by _3 desc").show()
(2)按照省份对学生进行分组统计人数
df01.select('_4').groupby('_4').count().show()
sqlContext.sql("select _4 ,count(*) counts from df01_table group by _4").show()
四、简答题
1.请任意写出4个RDD transformation算子并说明其作用
·map()
通过对这个RDD的每个元素应用一个函数来返回一个新的RDD
·flatMap(f, preservesPartitioning=False)
将函数应用于该RDD的所有元素,然后将结果平坦化(压扁),从而返回新的RDD
·filter(f)
对每个 元 素 应 用 f 函 数, 返 回 值 为 true 的 元 素 在RDD 中保留, 返回值为 false 的元素将被过滤掉
·distinct(numPartitions=None)
将RDD中的元素进行去重操作
·sortBy(ascending=True, numPartitions=None)
根据指定的Key进行排序
2. 请任意写出2个RDD Action算子并说明其作用
collect()
返回RDD中的所有元素
count()
返回RDD中的所有元素个数
3. 请任意写出4个DataFrame Tranformation算子并说明其作用
select()选择某些列
filter()条件查询
orderby()排序
distinct()去重
4. 请任意写出2个DataFrame Action算子并说明其作用
show()展示数据
head()返回数据前几项
5. Spark提供的编程语言接口有哪些?
Scala、Python、Java、R语言
6. 请根据你的理解,描述Hadoop和Spark有什么区别?
1)应用场景不同
Hadoop和Spark两者都是大数据框架,但是各自应用场景是不同的。Hadoop是一个分布式数据存储架构,它将巨大的数据集分派到一个由普通计算机组成的集群中的多个节点进行存储,降低了硬件的成本。Spark是那么一个专门用来对那些分布式存储的大数据进行处理的工具,它要借助hdfs的数据存储。
2)处理速度不同
hadoop的MapReduce是分步对数据进行处理的,从磁盘中读取数据,进行一次处理,将结果写到磁盘,然后在从磁盘中读取更新后的数据,再次进行的处理,最后再将结果存入磁盘,这存取磁盘的过程会影响处理速度。spark从磁盘中读取数据,把中间数据放到内存中,,完成所有必须的分析处理,将结果写回集群,所以spark更快。
3)容错性不同
Hadoop将每次处理后的数据都写入到磁盘上,基本谈不上断电或者出错数据丢失的情况。Spark的数据对象存储在弹性分布式数据集 RDD,RDD是分布在一组节点中的只读对象集合,如果数据集一部分丢失,则可以根据于数据衍生过程对它们进行重建。而且RDD 计算时可以通过 CheckPoint 来实现容错。
7. 请概括描述在windows/Linux/Mac(任选其一)系统下搭建Spark开发环境的流程
安装java、
安装python、
安装spark、
设置环境变量、
修改Log等级、
测试
8. 请描述累加器变量的作用
让多个task共同操作一份变量,主要可以进行累加操作。
9. 请描述设置检查点(Checkpoint)的作用
持久化操作仍然存在数据丢失的风险,此时可以使用checkpoint,设置一个还原点
10. 请描述使用RDD的编程步骤
step 1: 创建SparkContext对象
step 2: 通过SparkContext对象创建RDD
step 3: 对RDD进行Transformation操作(预处理)
step 4: 对RDD进行Action操作(输出结果)
11. 请描述使用DataFrame的编程步骤
step 1: 创建SparkSession对象
step 2: 通过SparkSession对象创建DataFrame
step 3: 对DataFrame进行Transformation操作(预处理)
## 通过DataFrame API 提供的方法
## 通过Spark SQL
step 4: 对DataFrame进行Action操作(输出结果)
12. 请描述通过RDD对流数据进行处理编程的步骤
根据数据源创建DStream
自定义处理逻辑
启动处理流程
等待处理结果
结束计算流程
13. 请描述通过GraphFrames库创建图实例的步骤,并至少列举出图实例的3个属性并说明其含义
(1) 创建顶点DataFrame对象:必须有id列,作为顶点的唯一标识
(2) 创建边DataFrame对象:必须有src和dst列
(3) 根据顶点和边DataFrame实例,创建图实例
vertices:顶点
edges:边
triplets:边表
degrees:顶点的度
inDegrees:入度
outDegrees:出度