Spark SQL概述
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.什么是Spark SQL
Spark SQL是Spark用来处理结构化数据的一个模块,它提供了2个编程抽象:DataFrame和DataSet,并且作为分布式SQL查询引擎的作用。
Hive是将Hive SQL转换成MapReduce然后提交到集群上执行,大大简化了编写MapReduc的程序的复杂性。
由于MapReduce这种计算模型执行效率比较慢。所有Spark SQL的应运而生,它是将Spark SQL转换成RDD,然后提交到集群执行,执行效率非常快!
温馨提示:
早期spark名称为"shark",故名意思,早期的spark版本主要以Hive SQL转换成RDD,但由于Hive是基于MapReduce模型研发的,而MapReduce的发展速度相对较慢这间接导致Hive的发展速度也缓慢。
由于Hive的发展速度较慢,于是Shark就模仿Hive的功能编写了自己的SQL,之后的版本都是基于自研的SQL来转换RDD,故shark更名为spark,当然现在的Spark版本也支持与Hive集成。
二.Spark SQL的特点
博主推荐阅读: http://spark.apache.org/sql/
三.什么是DataFrame
与RDD类似,DataFrame也是一个分布式数据容器。
然而DataFrame更像传统数据库的二维表格,除了数据以外,还记录数据的结构信息,即schema。
同时,与Hive类似,DataFrame也支持嵌套数据类型(struct、array和map)。
从API易用性的角度上看,DataFrame API提供的是一套高层的关系操作,比函数式的RDD API要更加友好,门槛更低。
上图直观地体现了DataFrame和RDD的区别。
左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解Person类的内部结构。而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么。
DataFrame是为数据提供了Schema的视图。可以把它当做数据库中的一张表来对待,DataFrame也是懒执行的。性能上比RDD要高,主要原因:优化的执行计划:查询计划通过Spark catalyst optimiser进行优化。
四.什么是DataSet
是Dataframe API的一个扩展,是Spark最新的数据抽象。 用户友好的API风格,既具有类型安全检查也具有Dataframe的查询优化特性。 Dataset支持编解码器,当需要访问非堆上的数据时可以避免反序列化整个对象,提高了效率。 样例类被用来在Dataset中定义数据的结构信息,样例类中每个属性的名称直接映射到DataSet中的字段名称。 Dataframe是Dataset的特列,DataFrame=Dataset[Row] ,所以可以通过as方法将Dataframe转换为Dataset。Row是一个类型,跟Car、Person这些的类型一样,所有的表结构信息我都用Row来表示。 DataSet是强类型的。比如可以有Dataset[Car],Dataset[Person]. DataFrame只是知道字段,但是不知道字段的类型,所以在执行这些操作的时候是没办法在编译的时候检查是否类型失败的,比如你可以对一个String进行减法操作,在执行的时候才报错,而DataSet不仅仅知道字段,而且知道字段类型,所以有更严格的错误检查。就跟JSON对象和类对象之间的类比。
五.SparkSession新的起始点
在老的版本中,SparkSQL提供两种SQL查询起始点:
SQLContext:
用于Spark自己提供的SQL查询。
HiveContext:
用于连接Hive的查询。
SparkSession是Spark最新的SQL查询起始点,实质上是SQLContext和HiveContext的组合,所以在SQLContext和HiveContext上可用的API在SparkSession上同样是可以使用的。
SparkSession内部封装了sparkContext,所以计算实际上是由sparkContext完成的。
六.博主推荐阅读
Spark SQL编程实战案例: https://www.cnblogs.com/yinzhengjie2020/p/13185272.html