hive 命令结果生成文件_HIVE 架构及原理

本文详细介绍了Hive的架构,包括Client、Metastore、Hadoop存储和Driver四个部分,强调了元数据在Hive中的重要性,以及如何通过Driver将SQL转化为MapReduce任务执行。此外,还分享了Hive的行转列、wordcount和类型转化等常用语句。
摘要由CSDN通过智能技术生成

HIVE 架构及原理

架构图

5b2c3a080615ab73fe7eb345fb19314d.png

1.Client:用户接口———三种使用方式

1、CLI hive  命令行模式command-line interface

直接输入/hive/bin/hive的执行程序,或者输入 hive –service cli        用于linux平台命令行查询,查询语句基本跟MySQL查询语句类似

2、hive  web界面的启动方式

hive –service hwi  用于通过浏览器来访问hive

hive –service hwi  用于通过浏览器来访问hive,如果lib目录下没有hive-hwi-{version}.war包,我们要自己打包

3、jdbc远程连接hiveserver2

2.Metastore:元数据 元数据包括表名、表所属的数据库、表的拥有者、列/分区字段、表的类型、表的数据所在目录等;默认存储在自带的derby数据 库中,由于开启多个hive时会报异常,推荐使用MySQL存储Metastore。

3.Hadoop 使用HDFS进行存储数据,使用MapReduce进行计算。

4.Driver:驱动器

解析器(SQL Parser):将SQL字符串转换成抽象语法树AST,对AST进行语法分析,比如表是否存在,字段是否存在,SQL语 义是否有误。 编译器(Physical Plan):将AST编译生成逻辑执行计划。 优化器(Query Optimizer):对逻辑执行计划进行优化。

结论

Hive通过给用户提供的一系列交互接口,接收到用户的指令(SQL),使用自己的驱动器(Driver),将SQL语句解析成对应的MapReduce程序,并生成相应的mapreduce jar包,结合元数据(MetaStore)提供的对应文件的路径,提交到Hadoop的Yarn中执行,最后将执行结果输出到用户交互接口,数据存储在HDFS当中。

Hive将元数据存储在数据库中,如mysql、derby。Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。

解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后由MapReduce调用执行。

Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(注意,简单的列查询不会生成MapRedcue任务)

ad1580755f589eef110dbddf947302ca.png

1.用户提交 查询等任务 给 Driver

2.Driver会发送 查询操作到Compiler(编译器)去生成一个execute plan

3.Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。

4.Compiler得到元数据信息,对task进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询plan,重写逻辑查询plan,将逻辑plan转化为物理的plan(MapReduce), 最后选择最佳策略。

5.将最终的plan提交给Driver

6.Driver将plan转交给ExecutionEngine去执行,将获取到的元数据信息,提交到JobTracker或者ResourceManager执行该task,任务会直接读取到HDFS中进行相应的操作。

7.获取执行的结果。

8.取得并返回执行结果。

优化器是一个不断更新的组件,大部分plan的转移都是通过优化器完成的。

常用语句

行转列:

1.先用explode炸开,去重

select distinct tmp.sub

from

(select explode(subject) as sub from t_stu_subject) tmp;

2.lateral view

select id, name,tmp.sub

from t_stu_subject lateral view explore(subjects) tmp as sub;

HIVE wordcount:

select word,count(1) as num

from (select explore(split(sentence,' ')) as word

from t_name) tmp

group by word

order by num desc;

类型转化:

select id,cast(birthday as date) as bir,cast(salry as floot) from t_name;

求出每人的累加总额

1.先求出每人每月的总额

create table t_account as

select id, month ,sum(account)

from t_n

group by id,month

2.join

create table t_tmp as

select a.id as id,a.month as month,a.t_account as accounts,b.account as account,

from t_account a join t_account b

on a.id = b.id

where a.month<=b.month;

3.累加

select id,month,max(amount) as account,sum(accounts) as mounts

from tmp

group by id,month;

第二种方法:

sum(amount) over(parttition by uid order by month rows between unbounded preceding and current row)

活跃用户

select ip,uid,access_time,url

from(select ip,uid,access_time,url,

row number() over(partition by uid order by access_time) as rn

from t_web

where day =5.17)tmp

where rn =1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值