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.逻辑执行计划
逻辑执行计划可以简单地看成是按照顺序在单机上跑的一个计算计划.