首先介绍一下Shark的概念

Shark简单的说就是Spark上的Hive,其底层依赖于Hive引擎的

但是在Spark平台上,Shark的解析速度是Hive的几多倍

它就是Hive在Spark上的体现,并且是升级版,一个强大的数据仓库,并且是兼容Hive语法的

下面给出一张来自网上的Shark构架图

从图上可以看出,Spark的最底层大部分还是基于HDFS的,Shark中的数据信息等也是对应着HDFS上的文件

从图中绿色格子中可以看到,在Shark的整个构架中HiveQL的引擎还是占据着底层不可分割的部分,而Meta store的制度是Hive的根本,对Shark的重要性自然不言而喻

Shark中创建一张外部分区表的代码格式如下:

create [external] table [if not exists] table_name(col_name data_type,…)

[partitioned by (col_name data_type,…)]

[row format row_format]

[fields terminated by ‘\t’]

[lines terminated by ‘\n’]

[stored as file_format]

[location hdfs_path]

基本和Hive的格式没有什么差别

在Shark中还有一种高效的表,叫做缓存表

创建缓存表的方式如下:

create table xx_cached as select …

只要在表名的最后加上_cached即可

缓存表顾名思义,将查询到的数据生成表存储在缓存中,再次查询的时候速度将是几何提升的

Shark的用法:

在Spark的bin目录下使用shark脚本进入客户端程序

shark -f 要执行的.sql文件位置

执行完后可以就生成对应的表,可以再客户端中使用SQL语句进行查询

但是…

对比起Hive,如此好用性能又好的Shark

在Spark1.0版本开始,Shark被官方抛弃了…

Why?

原因就是Shark太过依赖于Hive了,导致执行任务的时候不能灵活的添加新的优化策略

于是Spark团队决定从头开发一套完全脱离Hive,基于Spark平台的数据仓库框架

于是SparkSQL诞生了

相对于Shark,SparkSQL有什么优势呢?

第一,也是根本SparkSQL产生的根本原因,其完全脱离了Hive的限制

第二,SparkSQL支持查询原生的RDD,这点就极为关键了。RDD是Spark平台的核心概念,是Spark能够高效的处理大数据的各种场景的基础

第三,能够在Scala中写SQL语句。支持简单的SQL语法检查,能够在Scala中写Hive语句访问Hive数据,并将结果取回作为RDD使用

第四,Catalyst。Catalyst能够帮助用户优化查询,即使用户的水平不高,写不出高效率的代码,Catalyst也能够进行一定程度的性能优化

简简单单的从以上几点就可以看出,SparkSQL和Shark相比,在性能和可用性方面肯定提升了几个等级

在大数据处理领域,批处理、实时处理和交互式查询是三个主要的处理方式,SparkSQL诞生就是为了解决Spark平台上的交互式查询问题,并且提供SQL接口兼容原有数据库用户的使用习惯

这里要重点注意一下Catalyst部分。

Catalyst是SparkSQL的调度核心,翻译SQL语句形成执行计划的过程中会对其进行优化并且仍然是遵循DAG图

执行流程:

  1. SqlParser 对SQL语法进行解析
  2. Analyzer进行属性和关系关联校验
  3. Optimizer进行启发式逻辑查询优化
  4. QueryPlanner将逻辑查询计划转化为物理查询计划
  5. prepareForExecution调整数据分布,转换为执行计划
  6. 进入Spark执行空间转为DAG图执行

下面给出一张网上的SparkSQL构架图:

可以明显的看到,在Shark中出于底层关键地位的Hive变成了顶层可变的程序模块

并且SparkSQL还支持JDBC/ODBC等数据库接口和JSON格式,Parquet格式的数据

支持Java ,Python等编程接口

SparkSQL运行流程图:

文章的最后给出一段SparkSQL的实例代码(Scala语言):

val sc:SparkContext //定义一个SparkContext类型的常量sc,SparkContext是Spark中提交作业的唯一通道
val sqlContext = new SqlContext(sc)//根据sc new一个SqlContext对象,该对象是处理SparkSQL的
import sqlContext._ //引入sqlContext中的所有方法,这些方法是处理SQL语句的基础
case class Person(name:String,age:String)//定义一个Person类,case class是后面数据能够生产SchemaRDD的关键
val people:RDD[Person] = sc.textFile("people.txt").map(_.split(",")).map(p => Person(p(0),p(1).toInt))//定义一个RDD数组,类型为Person,从people.txt文件中读取数据生成RDD,根据,进行split之后进行map操作,将每一行记录都生成对应的Person对象
people.registerAsTable("people")//将得到的RDD数组注册为表“people”
val teenagers = sql("select name from people where age >= 10 && age <= 19")//定义要执行的sql语句
teenagers.map(t => "Name:" + t(0)).collect().foreach(println)//循环打印出teenagers中的每个对象的名字

Spark(三) -- Shark与SparkSQL的更多相关文章

  1. Spark视频 王家林 Spark公开课大讲坛第二期: Spark的Shark和SparkSQL

    王家林 Spark公开课大讲坛第一期:Spark把云计算大数据速度提高100倍以上 http://edu.51cto.com/lesson/id-30816.html Spark实战高手之路 系列书籍 ...

  2. Spark、Shark集群安装部署及遇到的问题解决

    1.部署环境 OS:Red Hat Enterprise Linux Server release 6.4 (Santiago) Hadoop:Hadoop 2.4.1 Hive:0.11.0 JDK ...

  3. Spark(九) -- SparkSQL API编程

    本文测试的Spark版本是1.3.1 Text文本文件测试 一个简单的person.txt文件内容为: JChubby,13 Looky,14 LL,15 分别是Name和Age 在Idea中新建Ob ...

  4. spark复习笔记(7):sparkSQL

    一.saprkSQL模块,使用类sql的方式访问Hadoop,实现mr计算,底层使用的是rdd 1.hive //hadoop  mr  sql 2.phenoix //hbase上构建sql的交互过 ...

  5. Spark(三): 安装与配置

    参见 HDP2.4安装(五):集群及组件安装 ,安装配置的spark版本为1.6, 在已安装HBase.hadoop集群的基础上通过 ambari 自动安装Spark集群,基于hadoop yarn ...

  6. spark三种连接Join

    本文主要介绍spark join相关操作. 讲述spark连接相关的三个方法join,left-outer-join,right-outer-join,在这之前,我们用hiveSQL先跑出了结果以方便 ...

  7. Spark(十三)SparkSQL的自定义函数UDF与开窗函数

    一 自定义函数UDF 在Spark中,也支持Hive中的自定义函数.自定义函数大致可以分为三种: UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_ ...

  8. spark 三种数据集的关系(二)

    一个Dataset是一个分布式的数据集,而且它是一个新的接口,这个新的接口是在Spark1.6版本里面才被添加进来的,所以要注意DataFrame是先出来的,然后在1.6版本才出现的Dataset,提 ...

  9. Spark(二十一)【SparkSQL读取Kudu,写入Kafka】

    目录 SparkSQL读取Kudu,写出到Kafka 1. pom.xml 依赖 2.将KafkaProducer利用lazy val的方式进行包装, 创建KafkaSink 3.利用广播变量,将Ka ...

随机推荐

  1. 使用div实现progress进度条

    在百度上搜了很多方法去修改HTML5 progress的样式,然而并没有实现. 所以自己用div实现了一个. 简单粗暴(*^-^*)  可以在CSS里改样式,可以JS里改进度. <div cla ...

  2. ZOJ-3822

    Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headm ...

  3. [译]Java8的函数式接口

    Java8引入了 java.util.function 包,他包含了函数式接口,具体的描述在以下api说明文档中: 函数式接口为lambda表达式和方法引用提供目标类型.每个函数式接口有一个单独的抽象 ...

  4. 读取pandas修改单列数据类型

    import pandas as pd import numpy as np df = pd.read_csv('000917.csv',encoding='gbk') df = df[df['涨跌幅 ...

  5. Selenium2+python自动化40-cookie相关操作【转载】

    前言 虽然cookie相关操作在平常ui自动化中用得少,偶尔也会用到,比如登录有图形验证码,可以通过绕过验证码方式,添加cookie方法登录. 登录后换账号登录时候,也可作为后置条件去删除cookie ...

  6. 本地配置环境打开项目出现404/本地wampserver配置伪静态以及php.ini配置

    本地wamp/phpstudy实现虚拟主机后,出现了500错误看日志看到.htaccess: Invalid command ‘RewriteEngine’, perhaps misspelled o ...

  7. 从1到整数n中1出现的次数

    题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数.例如输入12,从1到12这些整数中包含1的数字有1,10,11和12共出现了5次.   不考虑时间效率的解法: int Numbe ...

  8. Dfs【p4906】小奔关闹钟

    Background 由于今天是星期一,闹钟准时响了,由于小奔太困了,所以她想关停闹钟. Description 可是,他的闹钟电路太复杂了,有很多个开关,每个开关都连着其他开关,其他开关又连着更多的 ...

  9. 状压DP【p2622】 关灯问题II

    题目描述--->P2622 关灯问题II 没用的话: 首先第一眼看到题,嗯?n<=10?搜索? 满心欢喜地敲了一通搜索. 交上去,Wa声一片? 全部MLE! 这么坑人神奇? 一想,可能是爆 ...

  10. noi题库 1.7 字符串

    前九题 01:统计数字字符个数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一行字符,统计出其中数字字符的个数. 输入 一行字符串,总长度不超过255. 输出 输出为1行,输出字 ...