【大数据】SparkSQL

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cheidou123/article/details/87657257

一 前言

1.hive 把sql转化为mapreduce

缺点:底层是mapreduce,效率不高,后来做了改进,可以跑在tez,spark,mapreduce上面

2.shark

hive跑在spark上面
shark缺点:hive hql解析,逻辑执行计划生成依赖于hive的,仅仅把物理执行从mr改成spark。而且spark是基于线程的,所以会有线程安全问题。
shark 终止以后,产生了两个分支:

  • hive on spark
    hive社区,源码在hive中
  • SparkSQL
    spark社区,源码在spark中,sparkSQL减轻了依赖,支持多种数据源,多种优化技术,扩展性好很多。
3.SQL on hadoop常用框架
⑴ hive 用的最多的,将sql转化成mapreduce,
⑵ impala 使用cloudera开发的,它们还开发了web安装大数据cm,非mr的,基于内存的
⑶ presto 基于sql的
⑷ drill sql的,还能够访问hdfs和rdbms,json,hbase,mangodb等都能够访问。
⑸ spark SQL sql dataframe/dataset api进行编程,还能够访问hdfs和rdbms,json,hbase,mangodb等都能够访问。

二 什么是SparkContext

sparkSQL并不仅仅是SQL,它能够操作很多结构化的数据。

三 从HIVE到sparkSQL

从hive过渡到sparkSQL

SparkSession是sparkSQL2.0的入口点。

1.SQLContext
SQLContext是1.0的入口点。它也有很多子类。
在程序中这样执行
创建相应的Context
相关的处理
关闭资源

2.hiveContext
1.0入口点,和上面一样,传入sparkContext
它并不需要一个hive环境。只需要hive-site
创建相应Context
相关的处理:hiveContext可以直接读hive表。
关闭资源

3.sparkSession
2.0开始,相对于前面两个更加简单

四 dataframe 和 dataset

1.dataframe概述
首先我们看什么是dataset:分布式数据集
dataframe是以列的形式构成的分布式数据集。
dataframe可以以文本文件,hive数据,mysql数据等等的数据源。也可以通过RDD转化而来。

2.dataframe和rdd的对比
dataframe也是分布式数据集,不过它更像是一张表。它跟hive很类似。dataframe api层次更高。
RDD编程,不同语言性能不一样,而dataframe是一样的。

3.API常用操作
3.1如果创建dataframe
read.format.load
输出printSchema
3.2show 展示
show show 默认只显示前20条
我们也可以用take展示数据

3.3只查询某些列
select
3.4filter根据条件输出
filter 然后再show一下就出来了。可以在后面输入行数,show有很多重载方法。
3.5 group by
分组,分组之后可以再count
3.6排序
sort
3.7对列进行重命名
as方法
3.8join操作
join方法
默认是inner join,注意是===三个等号

4.dataframe和 rdd互操作(我们需要看官方文档)
优先考虑第一种。
4.1通过反射的方式
我们准确知道字段和字段类型
提前定义caseclass
toDF()方法
4.2编程的方式
scala可以将RDD转化成dataframe
当我们不知道列的时候。
步骤
创建RDD
定义列type
通过spark将rdd和type关联起来

5.dataset
它是一个新的接口,dataframe是先出来的。
强类型,支持lambad,提供sparkSQL优化
直接用ds.as[类型]就可以,注意需要导入隐式转换
dataset和dataframe使用是非常类似
语法解析(只有在运行时发现错误)
sql 运行时
df 方法报错,但是里面的操作不审核
ds 方法报错,里面的操作也审核,就是select里面的东西。可以更早的发现错误。

四 External Data Source

方便快速从不同数据源读取,经过混合处理,再将处理结果以特定格式写会到指定的系统上去。

1.操作parquet数据(sparksql默认的)
.read.format.load
load加载数据
write写回去
2.操作hive数据
读 spark.table
写 df.write.saveAsTable
我们可以通过sparksql建立df,然后直接建立表。

3.操作mysql数据
read.format.options方式,操作mysql有很多不同的写法,具体可以查看官网。
有了这个东西,我们操作关系数据库就不需要sqoop了。

案例:把mysql 和 hive表关联查询
0.1加载hive表数据到df
0.2加载mysql数据另外一个df
0.3两个df做join操作就可以

五 愿景

写更少的代码。spark core少于mr,sparkSQL少于spark core
1.同一接口访问
读写一套方法搞定不同数据源
我们可以把json读进来然后转化成parquet写回去。
2.强有力的api支持
3.Schema推导
我们在关系数据库创建表要写表名称和字段等等。
我们在sparkSQL中创建时不需要这些,在文件中可以直接推到出来。
另外类型也是可以兼容的。兼容到高精度类型
4.shema合并
简单来说就是添加列
开销很大。所以并不是必须的。默认情况下是关闭的。
5.partition discovery
自动分区探测
hive里面表的分区是比较通用的优化方式,分区存储在不同的目录里面。
parquet可以自动探测,根据我们文件存储的目录里面来。我们文件路径写到前面那一层,然后sparkSQL就可以自动识别里面的路径。
6.执行速度快
使用 dataframe比RDD快。RDD api是函数式不可变的,大部分时间创建临时对象,所以GC比较多,DF尽可能使用已有的对象。

2 读更少数据
2.1 使用列式存储。仅仅会去扫描需要的列。
2.2 使用分区裁剪 通常境况下,日志按天或者小时分区,如果查询2月份数据,就查指定分区。SQL里面加上查询条件就行
2.3 底层存了一些统计信息,比如最大,最小值,当我们查询sql,
2.4 把条件下压到数据源,从数据源端就过滤掉

3.优化交给底层
可以让小白写出高效的程序。
丢弃不需要的列,把条件下压到数据源。

有的时候我们先 join,在filter这样效率低,实际上sparkSQL一边读一边做过滤。

dataframe 或者dataset 默认就是逻辑执行计划,默认是actiion执行。

展开阅读全文

没有更多推荐了,返回首页