7. Spark SQL
1.分析SparkSQL出现的原因,并简述SparkSQL的起源与发展。
1.1.SparkSQL出现的原因
hive是shark的前身,shark是sparkSQL的前身,sparkSQL产生的根本原因是其完全脱离了hive的限制,hive是hive SQL转换成 MapReduce然后提交到集群上执行,大大简化了编写MapReduce的程序复杂性。同时也由于MapReduce的计算执行效率很慢,因此 spark SQL就这样出来,就是将spark SQL转换成RDD,然后提交到集群上执行,这样效率就非常快。
1.2.SparkSQL的起源与发展
要说这个的起源,我们要先供hive讲起。hive并不是另一个SQL,它只是SQL-on-Hadoop,执行的是在Hadoop上实现用 类SQL的语法 对 SQL 的快速查询。而在Spark 开始兴起之后,就开始转向在Spark上使用Hive,于是开发出了Shark==Hive on Spark.
Shark即Hive on Spark,为了实现与Hive兼容,Spark在HiveQL方面重用了Hive中Hive的解析,逻辑执行计划翻译,执行计划优化等逻辑,可以近似认为仅将物理执行计划从MapReduce作业替换成了Spark作业,通过Hive的HiveQL解析,把HiveQL翻译成Spark上的RDD操作。
但是,Shark的设计导致了两个问题:一是执行计划优化完全依赖于Hive,不方便添加新的优化策略;二是因为Sparl是线程级并行,而MapReduce是进程级并行,因此,Spark在兼容Hive的是现实上存在线程安全问题,导致Shark不得不使用另外一套独立维护的打了补丁的Hive源码分支。进而开发了SparkSQL。
SparkSQL是一个全新且兼容Hive的。在当时关系数据库已经很流行,但是关系数据库在大数据时代已经不能满足要求。首先,用户需要从不同的数据源执行各种操作,包括结构化和非结构化数据。其次,用户需要执行高级分析,例如像机器学习和图像处理等。而SparkSQL填补了这个鸿沟。SparkSQL首先可以提供DataFrame API,可以对内部和外部各种数据源执行各种关系操作。其次,可以支持大量的数据源和数据分析算法,SparkSQL可以融合传统关系数据库的结构化数据管理能力和机器学习算法的数据处理能力。
其中 SparkSQL 作为 Spark 生态的一员继续发展,而不再受限于 Hive,只是兼容 Hive;而Hive on Spark 是一个 Hive 的发展计划,该计划将 Spark 作为 Hive 的底层引擎之一,也就是说,Hive 将不再受限于一个引擎,可以采用 Map-Reduce、Tez、Spark 等引擎。
2. 简述RDD 和DataFrame的联系与区别。
2.1联系
1.RDD、DataFrame全都是spark平台下的分布式弹性数据集,为处理超大型数据提供便利
2.二者都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action算子如foreach时,二者才会开始遍历运算,极端情况下,如果代码里面有创建、转换,但是后面没有在Action中使用对应的结果,在执行时会被直接跳过,
3、二者都会根据spark的内存情况自动缓存运算,这样即使数据量很大,也不用担心会内存溢出
4、二者有许多共同的函数,如filter,排序等
2.2.区别
RDD是分布式的java对象的集合,但是对象内部结构对于RDD而言却是不可知的。
DataFrame是一种以RDD为基础的分布式数据集,提供了详细的结构信息,相当于关系数据库中的一张表
3.DataFrame的创建与保存
3.1 PySpark-DataFrame创建:
准备文件
people.txt
people.json
启动hdfs,并上传文件
spark.read.text(url)
spark.read.json(url)
spark.read.format("text").load("people.txt")
spark.read.format("json").load("people.json")
描述从不同文件类型生成DataFrame的区别。
txt文件生成的DataFrame只有value属性,而json文件生成的DataFrame会识别到文件中的键值
用相同的txt或json文件,同时创建RDD,比较RDD与DataFrame的区别。
区别:RDD直接输出对象,DataFrame输出的是详细结构
3.2 DataFrame的保存
df.write.text(dir)
df.write.json(dri)
df.write.format("text").save(dir)
df.write.format("json").save(dir)
4.选择题
4.1单选(2分)关于Shark,下面描述正确的是:C
A.Shark提供了类似Pig的功能
B.Shark把SQL语句转换成MapReduce作业
C.Shark重用了Hive中的HiveQL解析、逻辑执行计划翻译、执行计划优化等逻辑
D.Shark的性能比Hive差很多
4.2单选(2分)下面关于Spark SQL架构的描述错误的是:D
A.在Shark原有的架构上重写了逻辑执行计划的优化部分,解决了Shark存在的问题
B.Spark SQL在Hive兼容层面仅依赖HiveQL解析和Hive元数据
C.Spark SQL执行计划生成和优化都由Catalyst(函数式关系查询优化框架)负责
D.Spark SQL执行计划生成和优化需要依赖Hive来完成
4.3单选(2分)要把一个DataFrame保存到people.json文件中,下面语句哪个是正确的:A
A.df.write.json("people.json")
B.df.json("people.json")
C.df.write.format("csv").save("people.json")
D.df.write.csv("people.json")
4.4多选(3分)Shark的设计导致了两个问题:AC
A.执行计划优化完全依赖于Hive,不方便添加新的优化策略
B.执行计划优化不依赖于Hive,方便添加新的优化策略
C.Spark是线程级并行,而MapReduce是进程级并行,因此,Spark在兼容Hive的实现上存在线程安全问题,导致Shark不得不使用另外一套独立维护的、打了补丁的Hive源码分支
D.Spark是进程级并行,而MapReduce是线程级并行,因此,Spark在兼容Hive的实现上存在线程安全问题,导致Shark不得不使用另外一套独立维护的、打了补丁的Hive源码分支
4.5 多选(3分)下面关于为什么推出Spark SQL的原因的描述正确的是:AB
A.Spark SQL可以提供DataFrame API,可以对内部和外部各种数据源执行各种关系操作
B.可以支持大量的数据源和数据分析算法,组合使用Spark SQL和Spark MLlib,可以融合传统关系数据库的结构化数据管理能力和机器学习算法的数据 处理能力
C.Spark SQL无法对各种不同的数据源进行整合
D.Spark SQL无法融合结构化数据管理能力和机器学习算法的数据处理能力
4.6多选(3分)下面关于DataFrame的描述正确的是:ABCD
A.DataFrame的推出,让Spark具备了处理大规模结构化数据的能力
B.DataFrame比原有的RDD转化方式更加简单易用,而且获得了更高的计算性能
C.Spark能够轻松实现从MySQL到DataFrame的转化,并且支持SQL查询
D.DataFrame是一种以RDD为基础的分布式数据集,提供了详细的结构信息
4.7多选(3分)要读取people.json文件生成DataFrame,可以使用下面哪些命令:AC
A.spark.read.json("people.json")
B.spark.read.parquet("people.json")
C.spark.read.format("json").load("people.json")
D.spark.read.format("csv").load("people.json")
5. PySpark-DataFrame各种常用操作
5.1基于df的操作:
打印数据 df.show()默认打印前20条数据
打印概要 df.printSchema()
查询总行数 df.count()
df.head(3) #list类型,list中每个元素是Row类
输出全部行 df.collect() #list类型,list中每个元素是Row类
查询概况 df.describe().show()
取列 df[‘name’], df.name, df[1]
选择 df.select() 每个人的年龄+1
筛选 df.filter() 20岁以上的人员信息
筛选年龄为空的人员信息
分组df.groupBy() 统计每个年龄的人数
排序df.sortBy() 按年龄进行排序
5.2基于spark.sql的操作
创建临时表 df.registerTempTable('people')
spark.sql执行SQL语句 spark.sql('select name from people').show()
6.选择题
6.1单选(2分)以下操作中,哪个不是DataFrame的常用操作:D
A.printSchema()B.select()
C.filter()
D.sendto()
6.2多选(3分)从RDD转换得到DataFrame包含两种典型方法,分别是:AB
A.利用反射机制推断RDD模式
B.使用编程方式定义RDD模式
C.利用投影机制推断RDD模式
D.利用互联机制推断RDD模式
6.3多选(3分)使用编程方式定义RDD模式时,主要包括哪三个步骤:ABD
A.制作“表头”
B.制作“表中的记录”
C.制作映射表
D.把“表头”和“表中的记录”拼装在一起
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构