sparksql不复杂,只要创建好了DataFrame(泛型为RDD的DataSet),然后通过这个df创建个临时表然后写sql,就能用我们的sqark计算框架做一些我们想要的计算了,而且是只要写sql哦!是不是很好用,只要会sql!就能用!
SqarkSql
历史
hive------>shark-------->sparksql
shark是基于spark计算框架之上的兼容hiveyufa的sql执行引擎。底层计算采用spark所以很快,并且底层依赖hive的解析器和查询优化器,所以完全兼容hive语法,表结构以及UDF函数等。但也正是因为这一点,shark对hive的依赖性太强,无法很好地和spark其他组件集成,于是满足不了需求的shark自然会被淘汰。
详细介绍
sparkl产生的根本原因为了完全脱离hive的限制而产生。两种模式spark on hive 和hive on spark,区分在于谁做sql解析优化。
Spark on Hive: Hive只作为存储角色,Spark负责sql解析优化,执行。
Hive on Spark:Hive即作为存储又负责sql的解析优化,Spark负责执行。
对比一下
Hive,是将hive sql转换成MapReduce然后提交到集群中去执行,简化复杂MR代码,执行速度没那么快。
SparkSql是将sparksql转换成RDD提交到集群中去执行,简化了RDD代码操作,执行效率快(对比MR)。
底层架构
首先拿到sql后解析一批未被解决的逻辑计划,再经过分析得到分析后的逻辑计划,再经过一批优化规则转换成一批最佳优化的逻辑计划,再经过SparkPlanner的策略转化成一批物理计划,随后经过消费模型转换成一个个的Spark任务执行。
sql--(解析器)-->逻辑计划-->优化后的逻辑计划-->物理计划->spark任务(底层RDD)
而优化过程中会涉及到一个谓词下推的概念。
比如说
SELECT t1.name,t2.score FROM t1 JOIN t2 ON (t1.id = t2.id)
WHERE t1.age>50 AND t2.score>90
谓词下推图解
把条件推到最前面,最后join效率高,一开始就join数据量会大一点。
Dataset与DataFrame
底层封装的是RDD,都是分布式数据容器,可以把dataset就看做是一张二维的数据库表一样,里面有字段名,以及字段类型还有数据。而数据结构在这里叫做schema(元信息),数据就是RDD里面的东西咯。
dataFrame是泛型为Row类型的dataSet,即Dataset<Row> = DataFrame。
创建DataSet的几种方式
- 读取json格式的文件创建DataSet
- 通过json格式的RDD创建DataSet
- 通过反射将非json的RDD转换成DataSet
- 动态创建schema将非json格式的RDD转换成DataSet
- 读取parquet文件创建Dataset
- 读取JDBC中的数据创建DataSet
- 读取HIVE中的数据创建DataSet
这些在下一篇文章里我把我实验的api代码一起贴上详解~有很多细节注意点要注意。