一、查询解析
当你提交一个 Hive 查询时,首先 Hive 会对查询语句进行解析。这个过程包括词法分析和语法分析,将查询语句分解成一个个的逻辑单元,例如表名、列名、条件表达式等。
二、逻辑计划生成
- 基于解析后的查询语句,Hive 会构建一个逻辑计划。这个逻辑计划以抽象语法树(AST)的形式表示,描述了查询的逻辑操作,如选择、投影、连接等。
- 例如,对于一个简单的查询 “selectcol1, col2 from table1 where col3> 10;”,逻辑计划会包括从表 table1 中选择满足条件 col3 > 10 的记录,并投影出 col1 和 col2 列。
三、逻辑优化
- Hive 会对逻辑计划进行优化,以提高查询的执行效率。优化的方式包括常量折叠、谓词下推、列裁剪等。
- 常量折叠是指在编译时将常量表达式计算出来,减少运行时的计算量。谓词下推是将查询中的条件尽可能地推到数据源端进行过滤,减少数据的读取量。列裁剪是只读取查询中需要的列,减少数据传输和存储的开销。
四、物理计划生成
- 经过逻辑优化后,Hive 会将逻辑计划转化为物理计划。物理计划描述了如何在实际的计算框架(如 MapReduce)上执行查询。
- 对于 MapReduce 执行引擎,物理计划会确定如何将查询分解为 Map 阶段和 Reduce 阶段的任务。例如,对于连接操作,可能会在 Map 阶段进行数据的分区和排序,以便在 Reduce 阶段进行连接。
五、MapReduce 任务执行
- 最后,Hive 会将物理计划提交给 MapReduce 框架执行。在 Map 阶段,输入数据会被分割成一个个的输入分片,每个输入分片由一个 Map 任务处理。
- Map 任务会读取输入数据,执行用户定义的 Map 函数,对数据进行转换和过滤,并输出中间结果。中间结果会按照一定的规则进行分区和排序,以便 Reduce 任务进行处理。
- 在 Reduce 阶段,Reduce 任务会读取 Map 任务输出的中间结果,执行用户定义的 Reduce 函数,对数据进行聚合、连接等操作,并输出最终结果。