Spark SQL VS Hive
Spark SQL实际上并不能完全替代Hive, 因为Hive是一种基于HDFS的数据仓库, 并且提供了基于SQL模型的, 针对 存储了大数据的数据仓库, 进行分布式交互查询的查询引擎。
严格的来说, Spark SQL能够替代的, 是Hive的查询引擎, 而不是Hive本身, 实际上即使在生产环境下, Spark SQL 也是针对Hive数据仓库中的数据进行查询, Spark本身自己是不提供存储的,
自然也不可能替代Hive作为数据仓库的这个功能。
Spark SQL的一个优点, 相较于Hive查询引擎来说, 就是速度快, 同样的SQL语句, 可能使用Hive的查询引擎, 由于 其底层基于MapReduce, 必须经过shuffle过程走磁盘, 因此速度是非常缓慢的。
很多复杂的SQL语句, 在hive中执行都需 要一个小时以上的时间。 而Spark SQL由于其底层基于Spark自身的基于内存的特点, 因此速度达到了Hive查询引擎的数 倍以上。
但是Spark SQL由于与Spark一样, 是大数据领域的新起的新秀, 因此还不够完善, 有少量的Hive支持的高级特性, Spark SQL还不支持, 导致Spark SQL暂时还不能完全替代Hive的查询引擎。
而只能在部分Spark SQL功能特性可以满足 需求的场景下, 进行使用。
而Spark SQL相较于Hive的另外一个优点, 就是支持大量不同的数据源, 包括hive、 json、 parquet、 jdbc等等。 此外, Spark SQL由于身处Spark技术堆栈内, 也是基于RDD来工作,
因此可以与Spark的其他组 件无缝整合使用, 配合起来实现许多复杂的功能。 比如Spark SQL支持可以直接针对hdfs文件执行sql语句!
介绍
Spark SQL是用于结构化数据处理的Spark模块。与基本的Spark RDD API不同,Spark SQL提供的接口为Spark提供了有关数据结构和正在执行的计算的更多信息。在内部,Spark SQL使用这些额外的信息来执行额外的优化。与Spark SQL交互的方式有多种,包括SQL和Dataset API。计算结果时,使用相同的执行引擎,与您用于表达计算的API/语言无关。
为什么要有SPARK SQL:
1)发展历史
RDD(Spark1.0)=》Dataframe(Spark1.3)=》Dataset(Spark1.6)
如果同样的数据都给到这三个数据结构,他们分别计算之后,都会给出相同的结果。不同的是他们的执行效率和执行方式。在现在的版本中,dataSet性能最好,已经成为了唯一使用的接口。其中Dataframe已经在底层被看做是特殊泛型的DataSet。
2)三者的共性
(1)RDD、DataFrame、DataSet全都是Spark平台下的分布式弹性数据集,为处理超大型数据提供便利。
(2)三者都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action行动算子如foreach时,三者才会开始遍历运算。
(3)三者有许多共同的函数,如filter,排序等。
(4)三者都会根据Spark的内存情况自动缓存运算。
(5)三者都有分区的概念
Spark SQL的特点
1)易整合
无缝的整合了SQL查询和Spark编程。
2)统一的数据访问方式
使用相同的方式连接不同的数据源。
3)兼容Hive
在已有的仓库上直接运行SQL或者HQL。
4)标准的数据连接
通过JDBC或者ODBC来连接。
spark SQL编程
SparkSession新的起始点
在老的版本中,SparkSQL提供两种SQL查询起始点:
一个叫SQLContext,用于Spark自己提供的SQL查询;
一个叫HiveContext,用于连接Hive的查询。
SparkSession是Spark最新的SQL查询起始点,实质上是SQLContext和HiveContext的组合,所以在SQLContext和HiveContext上可用的API在SparkSession上同样是可以使用的。
SparkSession内部封装了SparkContext,所以计算实际上是由SparkContext完成的。当我们使用spark-shell的时候,Spark框架会自动的创建一个名称叫做Spark的SparkSession,就像我们以前可以自动获取到一个sc来表示SparkContext。
方法调用
1)创建一个maven工程SparkSQL
2)创建包名为com.atguigu.sparksql
3)输入文件夹准备:在新建的SparkSQL项目名称上右键=》新建input文件夹=》在input文件夹上右键=》新建user.json。并输入如下内容:
{“age”:20,“name”:“qiaofeng”}
{“age”:19,“name”:“xuzhu”}
{“age”:18,“name”:“duanyu”}
{“age”:22,“name”:“qiaofeng”}
{“age”:11,“name”:“xuzhu”}
{“age”:12,“name”:“duanyu”}
5)在pom.xml文件中添加spark-sql的依赖
6)代码实现
添加javaBean的User
代码编写
在sparkSql中DS直接支持的转换算子有:map(底层已经优化为mapPartition)、mapPartition、flatMap、groupByKey(聚合算子全部由groupByKey开始)、filter、distinct、coalesce、repartition、sort和orderBy(不是函数式的算子,不过不影响使用)
SQL使用方式
2.2.3 DSL特殊语法(扩展)
2.3 SQL语法的用户自定义函数
2.3.1 UDF
1)UDF:一行进入,一行出
2)代码实现
SparkSQL数据的加载与保存
读取和保存文件
SparkSQL读取和保存的文件一般为三种,JSON文件、CSV文件和列式存储的文件,同时可以通过添加参数,来识别不同的存储和压缩格式。
3.1.1 CSV文件
1)代码实现
3.1.2 JSON文件
3.1.3 Parquet文件
列式存储的数据自带列分割。
与Hive交互
SparkSQL可以采用内嵌Hive(spark开箱即用的hive),也可以采用外部Hive。企业开发中,通常采用外部Hive。
3.3.1 Linux中的交互
1)添加MySQL连接驱动到spark-yarn的jars目录
2)添加hive-site.xml文件到spark-yarn的conf目录
3)启动spark-sql的客户端即可
3.3.2 IDEA中的交互
1)添加依赖
2)拷贝hive-site.xml到resources目录(如果需要操作Hadoop,需要拷贝hdfs-site.xml、core-site.xml、yarn-site.xml)
3)代码实现