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





sparksql如何连接hive sparksql操作hive_spark


谓词下推图解

把条件推到最前面,最后join效率高,一开始就join数据量会大一点。

Dataset与DataFrame

底层封装的是RDD,都是分布式数据容器,可以把dataset就看做是一张二维的数据库表一样,里面有字段名,以及字段类型还有数据。而数据结构在这里叫做schema(元信息),数据就是RDD里面的东西咯。

dataFrame是泛型为Row类型的dataSet,即Dataset<Row> = DataFrame。

创建DataSet的几种方式

  1. 读取json格式的文件创建DataSet
  2. 通过json格式的RDD创建DataSet
  3. 通过反射将非json的RDD转换成DataSet
  4. 动态创建schema将非json格式的RDD转换成DataSet
  5. 读取parquet文件创建Dataset
  6. 读取JDBC中的数据创建DataSet
  7. 读取HIVE中的数据创建DataSet

这些在下一篇文章里我把我实验的api代码一起贴上详解~有很多细节注意点要注意。