[hive]hive工作原理(未完)

本文深入探讨了Hive的工作原理,从SQL语句的解析开始,通过ANTLR生成抽象语法树,再到语义分析、元数据绑定和检查,最后形成逻辑执行计划。Hive利用Metastore获取表的元数据,并确保所有聚合函数外的字段出现在GROUP BY子句中。整个过程展示了Hive如何处理大数据计算任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.例子

select dept, sum(salary) from emp group by dept;

考虑下这个东西你自己写会怎么计算:你有一张表在hdfs上,这个表是一张员工表,有几个字段:

id           名称          部门            备注           工资
id:integer,name:varchar,dept:varchar,memo: string,salary:Integer
1,           春日野悠,     总裁办,         暂缺,          1000
2,          春日野穹,      总裁办,         暂缺,         1000
3,          天女目英,      外联部,         无,           2000

这个sql是用来计算各个部门的总工资的。单机做的话,就是按照部门排个序,然后用一个循环单独遍历每个部门的总额,最后一个部门输出一条结果。

2.原理

1.生成抽象逻辑树节点

hive的执行顺序:

AST->逻辑执行计划->优化的逻辑执行计划->物理执行计划->打包提交->分布式执行

antlr是指可以根据输入自动生成语法树并可视化的显示出来的开源语法分析器

hive sql输入的是一个字符串,Hive需要先把字符串分解成自己明白的结构。hive解析用的是ANTLR,ANTLR是值可以根据输入自动生成语法树的解析器。

ANTLR生成的代码会返回给你ASTNode(AST是抽象语法树的简写),比如select会转化为一个以TOK_SELECT标记为根节点的树,树的叶子节点需要包含projection List子树(dept,count(*)),From子树,Filter子树(上面的例子空缺了)等等。也就是说AST会把一个长字符串转化成树结构,树本身的结构设计取决于你的语法定义,ANTLR会按照你的定义把树排列好.hive会遍历整个树.

2.信息的绑定和检查

遍历完整个AST,hive把它关心的信息分类组织到一个结构中,但是还没有进行原信息的绑定和检查整理.这个绑定整理的过程叫语义分析,对于上面的例子,hive会分别抽取:

1.projection list列表,上述例子就是dept,count(*),这里拿到的信息表示,用户希望结果是什么表达式

2.from列表,表示数据源

3,group by表示如何分组

元数据绑定:

首先hive调用metastoreclient接口,从元数据库中查询emp表的元数据信息,如表的结构.将这些信息注入本次执行hive的符号解析空间中,同时注入的还有内置函数(sum)和udf等。

然后hive对projection list列表中的表达式进行解析,首先是dept,hive会去搜索符号解析空间.找到dept字段,这里就是一个简单的字段引用,不涉及类型检查啥的.

第二列是sum(salary),这里hive发现这是一个函数调用,于是它搜索了函数表,找到了sum函数,并看到它是一个聚合函数,继续遍历sum子树又发现了一个salary子树,同样去搜索符号解析空间,找到salary.

group by检查

根据sql语义,出现在聚合函数外的字段必须出现在group by后,于是hive检查sum(salay)之外的字段,发现了dept,然后遍历group by列表进行匹配,如果所有的列都在group by之后了,则执行下一步.

3.逻辑执行计划

逻辑执行计划可以简单地看成是按照顺序在单机上跑的一个计算计划.

如何通俗地理解Hive的工作原理? - 知乎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值