Spark入门——5 SparkSQL
2015-06-14 13:34
274 查看
SparkSQL是在Spark1.0版本才加入的,shark已经不会再被投入资源来更新,而SparkSQL利用了Shark中最好的部分(例如:列式存储,等等)。SparkSQL除了致力于覆盖Shark所有功能之外还提供了SQL DSL API和灵活的程序扩展。SparkSQL的内部核心模块是Catalyst。
SparkSQL的逻辑架构图如下所示:
如上图所示:SQL引擎包含四个步骤:解析(parse),绑定(bind),优化(optimization),执行(excutor)。
1,解析阶段:
sparksql有两个语法解析器:基于hive的和sparkSQL自己的。但是无能哪个语法解析器,catalyst都能
通过自己完备的逻辑计划操作算子,将其映射成逻辑计划树。However,sparksSQL的DSL API 可以直接构造
逻辑计划树。
2,绑定元数据和语义分析阶段:
本阶段主要加入数据表中的元数据信息,获取数据表对应的列及其数据类型。catalyst也是基于Plugin实现管理源数据的
3,优化(逻辑计划优化阶段):
catalyst使用自己的规则集,对逻辑计划树进行优化(以Rule的方式针对各种优化条件进行映射)
4,执行阶段(物理计划生成阶段):
基于规则,选取不同的物理执行算子,把优化后的逻辑计划编程物理计划。最终提交执行引擎运行。
SqlContext
SqlContext是Catalyst的内置SQL扩展的基类实现,提供了解析,绑定,执行(生成基于RDD的物理计划),三个扩展。
HiveContext
将解析,绑定,生成基于RDD的物理计划算子串联起来。
1,HIveParse/Hive AST,将解析出的抽象语法树映射成Catalyst中定义的逻辑计划树
2,Hive Catalog ,存放数据库和表的元数据信息,hive中称MetaStore
3,HIve&Spark Planner,针对已优化过的逻辑计划,生成物理计划
DSL API分为两类:Context提供与数据源管理相关的API;SchemaRDD提供与SQL语言对应的DSL API
DSL API示例:
1>rdd1.select('a ' b+'c, 'd as 'aliasedName)--列选取
2>rdd1.where('a 'b>10)--条件筛选
3>rdd1.join(rdd2,Inner,'x.a==='y.a)--表连接
4>rdd1.orderBy('x.asc,'y.desc)--排序
5>groupBy('item)(Sum('num) as 'numb)--分组聚合
6>取别名
7>RDD3.unionAll(rdd4)
SparkSQL的逻辑架构图如下所示:
如上图所示:SQL引擎包含四个步骤:解析(parse),绑定(bind),优化(optimization),执行(excutor)。
1,解析阶段:
sparksql有两个语法解析器:基于hive的和sparkSQL自己的。但是无能哪个语法解析器,catalyst都能
通过自己完备的逻辑计划操作算子,将其映射成逻辑计划树。However,sparksSQL的DSL API 可以直接构造
逻辑计划树。
2,绑定元数据和语义分析阶段:
本阶段主要加入数据表中的元数据信息,获取数据表对应的列及其数据类型。catalyst也是基于Plugin实现管理源数据的
3,优化(逻辑计划优化阶段):
catalyst使用自己的规则集,对逻辑计划树进行优化(以Rule的方式针对各种优化条件进行映射)
4,执行阶段(物理计划生成阶段):
基于规则,选取不同的物理执行算子,把优化后的逻辑计划编程物理计划。最终提交执行引擎运行。
SqlContext
SqlContext是Catalyst的内置SQL扩展的基类实现,提供了解析,绑定,执行(生成基于RDD的物理计划),三个扩展。
HiveContext
将解析,绑定,生成基于RDD的物理计划算子串联起来。
1,HIveParse/Hive AST,将解析出的抽象语法树映射成Catalyst中定义的逻辑计划树
2,Hive Catalog ,存放数据库和表的元数据信息,hive中称MetaStore
3,HIve&Spark Planner,针对已优化过的逻辑计划,生成物理计划
DSL API分为两类:Context提供与数据源管理相关的API;SchemaRDD提供与SQL语言对应的DSL API
DSL API示例:
1>rdd1.select('a ' b+'c, 'd as 'aliasedName)--列选取
2>rdd1.where('a 'b>10)--条件筛选
3>rdd1.join(rdd2,Inner,'x.a==='y.a)--表连接
4>rdd1.orderBy('x.asc,'y.desc)--排序
5>groupBy('item)(Sum('num) as 'numb)--分组聚合
6>取别名
7>RDD3.unionAll(rdd4)
相关文章推荐
- 搭建Oracle dblink访问PostgreSQL
- redis 主从配制及手动切换
- SQL学习心得(转)
- Redis主从自动failover
- MySQL 主主同步配置步骤
- MongoDB for C#基础入门
- Orcle索引及约束管理
- sql-将一个表中的数导入另一个表中
- mongodb培训
- Memcached stats 命令属性含义
- 开放远程连接mysql
- MongoDB的学习笔记
- RedHat5.4安装oracle11g
- 我的MySQL使用手记
- 使用JDBC连接MySQL数据库--典型案例分析(二)--封装数据库的连接与关闭
- mysql group by 使用技巧及其with rollup使用
- Sqlite中的limit和offset的用法
- SQL完全卸载和安装教程网址链接。
- SQL Server备份脚本
- Memcached 实例