三、 Hive 逻辑算子及其生成(上)

前一章本文介绍了Hive如何将HiveQL语言转换成抽象语法树(AST),本章将介绍Hive逻辑算子以及如何将AST转换成逻辑算子DAG图。

3.1 什么是逻辑算子

   以如下HiveQL语句为例:

select* from a where id>100 limit 10

   这条语句从表a中取id>100的前10条数据,Hive首先将该语句转换成AST如下图所示:

三、 Hive 逻辑算子及其生成(上)_第1张图片

                                              图3.1 语法树

接着,Hive将这棵AST树转换成逻辑算子DAG图如下:

三、 Hive 逻辑算子及其生成(上)_第2张图片
                                          图3.2算子DAG图

图3.2是只有一条分支的简单DAG图,图中每个节点是一个算子(Operator)。每个算子代表了对数据某种的处理逻辑,算子包含三个主要的方法:

1)initialize:完成算子的初始化。

2)process:完成数据的处理,每次处理表中一条记录的数据。

3)forward:将处理完成的结果输出给子节点处理。

图3.2中,TS是TableScanOperator算子的简写,表示table扫描运算,该算子依次读取表中的每条记录,输出给子节点处理。FIL为FilterOperator的简写,表示过滤运算,对应HiveQL中的where语句。该算子会对输入的记录做过滤运算,将符合where表达式的记录输出给子节点,不符合的过滤掉。SEL是SelectOperator的简写,表示投影运算,对应select语句。该算子对输入的记录,计算select表达的值并输出给子节点,本例中会将输入记录的所有列全部输出。LIMI是LimitOperator算子的简写,表示limit运算,和limit语句对应。该算子控制输出记录的数量,如果数量超过limit值,停止输出。FS是FileOperator的缩写,表示数据输出算子。该算子将输入的记录输出到文件系统,对查询语句而言,记录会输出到临时文件中。

Hive中其他重要的算子还包括JoinOperator(JOIN),GroupByOperator(GBY),ReduceSinkOperator(RS),MapJoinOperator(MapJoin)等。

下面是一个复杂的HiveQL语句:

from student a join score b on a.id=b.id
insert overwrite table d1 selecta.id,count(b.score) group by a.id
insert overwrite table d2 select a.id,b.scoreorder by b.score limit 10

这条语句是多insert语句,包含两条insert语句,生成的算子DAG如下:

三、 Hive 逻辑算子及其生成(上)_第3张图片

                                   图3.3 多Insert语句算子DAG

JOIN算子左边两条分支分别读取表student和score的数据,并进行过滤,按照id分发数据 (ReduceSinkOperator完成),JOIN算子完成join运算,输出给右边两个insert语句的算子分支对数据进一步处理,最后通过FS算子输出到各自的目的数据源。

下表给出了Hive部分算子的功能介绍。

算子(简称)

功能

说明

TableScanOperator(TS)

表扫描

HiveQL语句每张表对应一个TS算子。

SelectOperator(SEL)

投影运算

对应select语句

FilterOperator(FIL)

过滤运算

对应where语句

GroupByOperator(GBY)

Group by运算,包括hash group by和sort group by两种实现。

对应group by语句,Distinct也通过GBY实现

ReduceSinkOperator(RS)

实现map端数据输出、排序和数据分发。

需要数据分发,排序的情况下会生成RS算子,如包含group by,sort by,join,distribute by,cluster by,order by语句的情况。

JoinOperator(JOIN)

Join运算

对应join语句

MapJoinOperator(MAPJOIN)

Map端join运算,将小表数据加载到内存和大表join.

在mapjoin的情况下,join语句会生成MAPJOIN算子。

ScriptOperator(SCR)

脚本运算

Select中包含transform脚本的情况下生成该算子。

UDTFOperator(UDTF)

输出UDTF函数计算结果

包含udtf函数的情况下,生成UDTF算子。

UnionOperator(UNION)

UNION运算,对应union语句

对应union语句





你可能感兴趣的:(hive)