一、单选题
1. 下面的端口不是 Spark 自带的服务端口的是___________。
A. 8080 B. 4040 C. 8090 D. 18080
2. 下面的描述不是 RDD 的特点的是___________。
A. 可分区 B. 可序列化 C. 可修改 D. 可持久化
3. 关于广播变量的描述错误的是___________。
A. 任何函数调用 B. 是只读的
C. 存储在各个节点 D. 存储在磁盘或 HDFS
4. 在启动 pyspark 交互式界面时,采用默认的不指定参数的启动方式属于___________部署方式。
A. standalone B. Spark on mesos
C. Spark on YARN D. Spark on local
5. pyspark 中,Spark DataFrame 和 Spark SQL 的上下文入口是___________。
A.pyspark.SparkConf B. pyspark.SparkSession
C. pyspark.SparkContext D. pyspark.StreamingContext
6. 下面的操作中,___________肯定是宽依赖。
A. map B. flatMap C. reduceByKey D. sample
7. Spark 持久化默认的存储级别是___________。
A. MEMORY_ONLY B. MEMORY_ONLY_SER
C. MEMORY_AND_DISK D. MEMORY_AND_DISK_SER
8. DataFrame 和 RDD 的最大的区别是___________。
A. 科学统计支持 B. 多了 schema C. 存储方式不一样 D. 外部数据源支持
9. 与 spark 日志相关的配置文件是___________。
A. spark-env.sh B. log4j.properties C. slaves D. profile
10. spark 机器学习库有两种,其中 ml 库是基于___________数据结构的 API。
A. Spark SQL B. DataFrame C. Spark Streaming D. RDD
11. 关于累加器,下列描述错误的是___________。
A. 支持加法 B. 支持数值类型 C. 可并行 D. 不支持自定义类型
12. 下面操作属于窄依赖的是___________。
A. join B. filter C. group D. sort
13. pyspark 中,Spark RDD 的上下文入口是___________。
A. pyspark.SparkConf B. pyspark.SparkSession
C. pyspark.SparkContext D. pyspark.StreamingContext
14. pyspark 中,提供广播变量的操作方法的类是___________。
A. pyspark.SparkConf B. pyspark.Accumulator
C. pyspark.RDD D. pyspark.Broadcast
15.需要基于DataFrame创建出临时表,才能使用SQL语句的是?___________。
A.Spark SQL B.DataFrame
C.Spark Streaming D.GraphX
16.以下哪项是由一系列RDD构成的?___________。
A.StreamingContext B.DStream
C.Spark Streaming D.DAG
17.哪个选项提供常用的学习算法,如分类、回归、聚类等算法?___________。
A.Utilities B.Featurization
C.Pipelines D.ML Algorithms
18.下列RDD操作以数组的形式返回数据集的所有元素的是?___________。
A.reduce B.count
C.collect D.first
19.含有自环的图被称为?___________。
A.多重图 B.伪图
C.二分图 D.连通图
20. 在不改变原有 Key 键的基础上,对 Key-Value 结构 RDD 的 Vaule 值进行
一个 map 操作,分区保持不变。这种操作使用的算子是___________。
C. combineByKey D. reduceByKey
21. Spark SQL 的创建需要依赖于___________。
A. Spark RDD B. spark DataFrame
C. Spark Streaming D. GraphX
22. Spark Streaming 提供的基础抽象是___________,它表示一系列的数据流。
A. StreamingContext B. Discretized Streams
C. Spark Streaming D. RDD
23. Spark 机器学习库 ml 中,提供用于构建,评估和调整 ML Pipelines 的工具是___________。
A. ML Algorithms B. Featurization
C. Pipelines D. Utilities
24. 下列 RDD 算子中,属于 transform 算子的是___________。
A. collect B. reduce
C. foreach D. union
25.下列RDD操作哪一个返回结构的类型不是以数组形式的?___________。
A.first B.top
C.collect D.take
26.Spark的四大组件中不包括下列哪个选项?___________。
A.Spark Streaming B.MLlib
C.Spark R D.GraphX
27.Spark为包含键值对(key-value)类型的RDD提供了一些专有的操作。这些RDD被称为___________。
A.PairRDD B.KeyRDD
C.key-value RDD D.Value RDD
28.Spark主要有几个特点?___________。
A.3 B.4
C.5 D.6
29.Spark的运行环境搭建不依赖于?___________。
A.Java B.Scala
C.Spark D.Python
30.哪个选项以 RDD 为基础并将数据整理成表格形式?___________。
A.Spark SQL B.DataFrame
C.Spark Streaming D.GraphX
31.下列选项属于DStream输出操作的是?___________。
A.map B.flatMap
C.reduceByKey D.pprint
32. 下列方法可以对 Spark RDD 进行持久化的是___________。
A. persist B. save
C. print D. collect
33.哪个选项是Spark为Python开发者提供的API?___________。
A.PySpark B.Python Spark
C.Scala D.Spark SQL
34.进入web监控页面看到Spark Master at spark://host:port,属于哪种启动模式?___________。
A.local B.mesos
C.yarn D.standalone
35.哪个选项是Spark最基础最核心的部分?___________。
A.Spark Streaming B.Spark SQL
C.RDD D.MLlib
二、填空题
1.mllib是基于RDD的api,ml是基于 DataFrame 的api。
2. 根据代码填空:
sc=SparkContext("spark://10.92.16.21:7077","app")
sc.setLogLevel("WARN")
data =[1,2,3,4,5,6]
dist =sc.paralellize(data,3)
dist2 =rdd.map(lambda x:x*2)
dist2.persist()
dist3 =dist.intersection(dist2)
dist3.collect()
上述代码使用的 Spark 运行模式是___Standalone____;日志级别是____WARN____;变量名为 dist 的这个 RDD 变量有___3__分区(partition);代码 dist2.persist()的作用是__统计文件中字符数量_______;代码dist3.collect()的输出结果是__[(1,2),(2,4),(3,6),(4,8),(5,10),(6,12)]
3.已知rdd=sc.parallelize([21,17,19,4,15,6,22]),则rrd.take(4)和rrd.top(5)的运行结果分别为 [21,17,19,4] [22,21,19,17,15] 。
4.根据代码填空:
file =sc.parallelize(["1","2","","3","","4","","","5"])
blanks =sc.accumulator(0)
def countblanks(line):
global blanks
if(len(line) ==0):
blanks +=1
return line
file.map(countblanks).collect()
print(blanks.value)
上述代码的目的是__统计一个RDD中有多少元素为空__;使用的共享变量是__accumulator______,该共享变量的变量名是__blanks____;代码 len(line)的含义是__line的长度_____;最后一句代码print(blanks.value)的输出结果是_4_____。
5.RDD算子包括 transform算子 和action算子(执行算子)两种类型。
6. 根据代码填空:
a =sc.textFile(“/root/index.txt”)
b =a.collect()
c =sc.broadcast(b)
d =sc.parallelize([0,0,0,0]).flatMap(lambda x: c.value)
d.collect()
c.unpersist()
上述代码使用的共享变量是__broadcast_____;该共享变量的变量名为_c__;查看该共享变量的值的方法是_c.value__;假设 a.collect()的结果是[3,2,1,0],则代码 d.collect()的输出结果是_[3,2,1,0,3,2,1,0,3,2,1,0,3,2,1,0]___;代码 c.unpersist()的作用是__解除广播变量的持久化操作_______。
RDD只支持粗粒度转换,即在大量记录上执行单个操作。RDD的血统(Lineage)会记录 RDD的元数据信息和转换行为,当该RDD自内部分分区数据丢失时,它可以根据这些信息重新运算并恢复丢失的分区数据。
1).从集合中创建RDD,Spark主要提供了两个方法:parallelize和makeRDD
2).从外部存储文件创建RDD
3).从其它RDD创建
4).直接创建RDD(new)
5).基于Nosql创建rdd,如hbase
6).基于s3创建rdd,
7).基于数据流,如socket创建rdd
区别:RDD是分布式的java对象的集合,但是对象内部结构对于RDD而言却是不可知的。DataFrame是一种以RDD为基础的分布式数据集,提供了详细的结构信息,相当于关系数据库中的一张表
联系1.都是spark平台下的分布式弹性数据集,为处理超大型数据提供便利2、都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action才会运算3.都会根据spark的内存情况自动缓存运算,这样即使数据量很大,也不用担心会内存溢出4、三者都有partition的概念5.三者有许多共同的函数,如filter,排序等
6.请简述SparkStreaming的工作原理?
SparkStreaming从数据流接受实时数据流,并将数据分为若干批,然后由spark引擎进行处理,最后批量生成结果流。
7.spark运行模式有哪些,并简要说明每种运行模式?
local模式:spark单机运行,一般用于开发测试。
standalone模式:构建一个由Master+Slave构成的Spark集群,Spark运行在集群中。
spark on Yarn模式:Spark客户端直接连接Yarn,不需要额外构建Spark集群。
spark on Mesos模式:Spark客户端直接连接Mesos,不需要额外构建Spark集群。
8.请列举7个 Spark RDD 的action算子,并简述功能。
答:
reduce(f):通过指定的聚合方法对 RDD 中的元素进行聚合操作。
collect():返回一个包含 RDD 所有元素的列表。
count():统计 RDD 中元素的个数。
take(n):获取 RDD 中前 n 个元素的值,返回的结果为列表类型。
first():返回 RDD 中的第一个元素,返回的数据类型为元素类型。
top(n):返回 RDD 中最大的前 n 个元素,返回的结果为列表类型。
saveAsTextFile():将 RDD 中的元素以字符串的格式存储于文件系统中。
foreach(f):遍历 RDD 中的每个元素,同时通过传递自定义的处理函数 f,对 RDD 中的每个元素进行处理。
foreachPartition(f):遍历 RDD 的 每个分区,同时通过传递的 f 对每个分区进行操作。
9.列举7个Spark RDD 的transformation 算子,并简述功能。
答:
map:对RDD中的数据逐条进行映射,可以是类型转换,也可是值转换。
flatMap:先对RDD中的所有元素进行map操作,然后将结果平坦化。
filter:按照指定条件对RDD中的元素进行过滤。
union:将两个RDD求并集,并返回一个新的RDD。
intersection:将两个RDD求交集,并返回一个新的RDD,其输出不包含任何重复元素。
sortBy:通过指定key对RDD中的元素进行排序。
mapPartitions:对RDD的每个分区进行map运算。
四、编程题
1. 微博数据分析。
假设有一个数据文件,存储路径为“/home/ubuntu/data/blogInfo.txt”,它包含如下格式的两列数据(其中第一列和第二列都表示用户 ID,每行数据的含义是第一列的用户关注了第二列的用户。数据使用“\t”分隔符隔开):
数据示例:
11111111 12743457
11111111 16386587
11111112 12356363
现使用 pyspark 交互式界面,请使用 Spark RDD 的相关知识编写代码回答下列问题:
(1)将数据读成 RDD 格式。
(2)统计一共有多少个不同的用户 ID。
(3)统计出每个用户的粉丝数量。
(4)将步骤(3)的结果写入到 HDFS 文件中(具体路径为:hdfs://linux01:9000/out/result.txt)。
答
(1)Lines = sc.textFile(“/home/ubuntu/data/blogInfo.txt”)
(2)Data = lines.flatMap(lambda x:x.split(“\t”))
Result = data.distinct().count()
(3)Data3 = lines.map(lambda x: x.split(\t)[1])
Result3 = data3.map(lambda x: (x,1)).reduceByKey(lambda x,y: x+y).collect()
(4)Result3.saveAsTextFile(hdfs://linux01:9000/out/result.txt)
2. 网页流量日志分析。
假设有一个数据文件,存储路径为“/home/ubuntu/data/log.txt”,它包含如下格式的三列数据(其中第一列表示访问时间,第二列表示网页名称,第三列表示访问次数。数据使用“\t”分隔符隔开):
数据示例:
time name num
20200501 baidu 2
20200501 sina 3
20200502 qq 3
20200502 baidu 5
现使用 pyspark 交互式界面,请使用 Spark SQL 的相关知识编写代码回答下列问题:
(1)将数据读成 DataFrame 类型,列名分别为“time”、“name”和“num”。
(2)将数据注册为 SQL 表,表名为“log”。
(3)统计同一天里同一网页的总访问量。
(4)统计每个网页的总访问量,并按照总访问量降序排序。
答
(1)data = spark.read.load(“/home/ubuntu/data/log.txt”, format =”csv”, sep=”\t”, header=True)
(2)data.registerTempTable(“log”)
(3)spark.sql(“select time,name,sum(num) from log groupby time,name”).show()
(4)sql = “select name,sum(num) fangwenliang from log groupby name order by fangwenliang desc”
spark.sql(sql).show()
3. 员工数据分析。
假设有员工数据,存储路径为
“/home/ubuntu/data/employee.json”,其数据格式如下:
{“id”: 1,“name”: “Ella”, “age”: 36}
{“id”: 2,“name”: “Bob”, “age”: 29}
{“id”: 3, “name”: “Jim”, “age”: 28}
假设编程环境为 pyspark 交互式界面,请使用 Spark DataFrame 的相关知识编写代码回答下列问题:
(1)将数据加载为 DataFrame 格式。
(2)查询所有数据,并删除重复的数据。
(3)将数据按照 name 升序排列。
(4)将数据保存为 parquent 格式,仍旧保存在/home/ubuntu/data/目录下。
答:
(1) employee = spark.read.json(“/home/ubuntu/data/employee.json”)
(2) employee.select(“id”,”name”,”age”).distinct().show()
(3) employee.select(“id”,”name”,”age”).orderBy(“name”).show()
(4) employee.write.save(“/home/ubuntu/data/employee.paquent”)
4. Spark Streaming 计算。
现通过本地的 9999 端口发送日志流数据,数据格式如下(数据中有三个字段,含义分别为:访问网址,访问流量,访问时间戳。各字段使用“,”隔开):
数据示例:
www.baidu.com,12853,2586213654
假设编程环境为 pyspark 交互式界面,请使用 Spark Streaming 的相关知识编写代码回答下列问题:
(1)创建一个 DStream,监听该端口的数据,时间间隔为 5 秒。(提示:注意导入 streaming 包和上下文的创建)
(2)使用有状态转换 updateStateByKey 统计每个网站的总访问流量。
转发标明出处