0


hive sql 和 spark sql的区别

目录

要知道两种sql的区别,先要知道什么是hive,什么是spark

一、什么是hive,什么是spark

(一)hive

百度百科上的定义:hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。

1、hive在hadoop中的角色

定语角色作用优点基于Hadoop的数仓工具查询引擎可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转化为MapReduce任务进行运行学习成本低,可以通过类sql语句执行统计,不必开发专门的MapReduce应用建立于Hadoop上的数据仓库基础架构数据仓库它提供了一系列工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制,它定义了类SQL语言HQL,允许熟悉SQL的用户查询数据简化了查询分析工作––––

2、hive和关系型数据库的区别

hive关系型数据库存储系统HDFS服务器本地的文件系统计算模型mapreduce关系型数据库自己设计的计算模型设计初衷海量数据做数据挖掘实时查询实时性实时性差就是为实时查询而生的扩展性和hadoop一样,计算能力和存储能力扩展方便相对差很多

3、hive 架构及执行流程介绍

hive架构图
hive架构图
hive基于大数据底座hadoop
类型组件作用备注客户端CLI终端命令执行接口客户端Thrift客户端包含JDBC/ODBC在内的诸多连接方式均建立在thrift客户端之上客户端WEB GUI提供了一种通过网页的方式访问hive的途径,接口对应hwi(hive web interface),需要提前启动hwi服务服务端Driver组件包含Complier、Optimizer、Executor,负责将hql进行编译,优化生成执行计划,而后调用mapreduce进行计算执行服务端MetaStore元数据服务组件,负责存储hive的元数据,因为元数据的重要性,hive支持把metastore服务独立出来,安装到远程的服务器集群中,从而解耦hive和metastore,保证hive运行的健壮性服务端Thriftfacebook开发的软件框架,用来进行可扩展且跨语言的服务开发,hive集成了该服务,能让不同的开发语言调用hive接口
hive sql执行流程图
hive执行流程图

(二)spark

百度百科上的定义:Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。

1、spark组件介绍

在这里插入图片描述
组件定义备注Apache Spark核心Spark Core是Spark平台的基础通用执行引擎,Spark所有其他功能都基于该核心执行。它提供了内存计算及外部存储系统中的参考数据集。Spark SQL引入了一种名为SchemaRDD的新数据抽象,提供了对结构化和半结构化数据的支持。Spark StreamingSpark Streaming利用Spark Core的快速调度功能来执行流式分析。它以小批量采集数据,并对这些小批量数据执行RDD(弹性分布式数据集)转换。官方文档中成为微批处理,最小时间间隔为0.5是sMLlib(机器学习库)MLlib是Spark上面的分布式机器学习框架,根据基准测试,由MLlib开发人员针对交替最小二乘(ALS)实现完成。GraphXGraphX是Spark顶部的分布式图形处理框架。它提供了一个用于表达图形计算的API,可以使用Pregel抽象API对用户定义的图形进行建模。它还为此抽象提供了优化的运行时。

2、spark 和 mapreduce对比

需要说明的是,spark的主要实现目的就是优化mapreduce 执行,目前来看它做到了,实现原理可以说都是基于google的那篇Google-MapReduce的论文。
对比方面\计算引擎sparkmapreduce备注计算方式内存计算IO读写迭代计算过程中,MR需要不断IO,而spark引入了RDD+DAG,使计算过程基于内存完成,提升了处理性能任务调度task为线程级别task为进程级别spark可以通过复用线程池中的线程减少启动、关闭task所需要的消耗执行策略Spark在shuffle时只有部分场景才需要排序,支持基于Hash的分布式聚合,更加省时MapReduce在shuffle前需要花费大量时间进行排序

3、spark sql 执行

在spark之前databricks公司还推出过spark的上一代产品 shark ,实现了内存计算模型,相对于hive实现了上百倍的性能提升,但是由于其对于hive的过度依赖(主要是sql执行过程中的解析器,优化器等),最终被放弃。

spark 通过Catalyst模块实现了解析器、执行计划生成、优化器功能,完全脱离了对hive的依赖。

二、hive sql 和 spark sql 的对比

sql生成mapreduce程序必要的过程:解析(Parser)、优化(Optimizer)、执行(Execution)
hive sqlspark sql备注解析/优化/执行hive自有程序spark自有程序,主要是catalyst虽然hive sql spark sql 语法上和执行上看起来差别不大,但是因为spark 的提效目的,其实优化器中做了许多优化计算引擎hadoop集群中默认是mapreduce默认是sparkhive sql可以通过配置更改其计算引擎
catalyst的主要优化点
1、谓词下推

sql 语句

select a.*,b.*from 
tb1 a join tb2 b 
on a.id = b.id 
where a.c1 >20and b.c2<100

会被优化为

select a.*,b.*from(select*from tb1 where c1>20) a 
join(select*from tb2 where c2<100) b 
on a.id = b.id

减少后期执行过程中的join的shuffle数据量;

2、列裁剪

sql语句

select a.name,b.salary from(select*from tb1 where c1>20) a 
join(select*from tb2 where c2<100) b 
on a.id = b.id

会被优化为

select a.name,b.salary from(select id,name from tb1 where c1>20) a 
join(select id,salary from tb2 where c2<100) b 
on a.id = b.id

执行前将不需要的列裁剪掉,减少数据量获取;

3、常量累加

sql语句

select1+1as cnt from tb

会被优化为

select2as cnt from tb

三、其他补充

日常使用中发现的差异,窗口函数中hive sql 若没有可以不用填写partition by order by ,会默认不指定执行,但是spark sql 中不支持,必须填写完整才能执行,示例

/*获取数据行号*/select row_number()over() rownum from tb1;
/*获取数据行号*/select row_number()over(partitionby1orderby1) rownum from tb1;

如上两种写法,在hive中都可以正常运行,并且正确得到表的行号,而spark只支持下面那种写法。

参考文档:
Apache Spark简介:https://www.codingdict.com/article/8118
Hive计算引擎:https://mp.weixin.qq.com/s/5-64YPCA8pMopjkW3cQdPg
详解Spark SQL:https://mp.weixin.qq.com/s/uMZIoomS0DocGGEvMt-Exw

标签: hive sql spark

本文转载自: https://blog.csdn.net/MDJ_D2T/article/details/120836600
版权归原作者 抓住小白白 所有, 如有侵权,请联系我们删除。

“hive sql 和 spark sql的区别”的评论:

还没有评论