coderplay
2/18/2013 - 1:39 AM

Hive Semantic Analyzer.md

SemanticAnalyzer主体流程

  • 新建QueryBlock
  • 预处理(语意分析)
  • 获取MetaData
  • 获取每个源table的相关结构
  • 将视图替换, 重写, 并将其记入view别名
  • 检查inputformat
  • 保存alias->tab 至QB
  • 为子查询获取meta
  • 获取目标的相关结构, 目标有两种:表或本地目录
  • 生成计划
  • 递归生成子查询的计划, 将它放入 alias -> OP 的map里
  • 优化
  • 生成mapreduce任务

预处理 doPahse1

Select

  • 向ParseInfo设置Select子查询
  • 由FunctionRegistry判断select items表达式哪些是聚合函数, 从中获得 <Agg, AST >, 并设置
  • 从select里获取col别名, AST->别名
  • 获取distinct的Agg, 并设置

From

  • 判断至少有一个源头表, 否则抛出异常
  • 分别处理表、子查询、视图和Join
  • 遍历tabref树, 查找表的别名, 一旦发现加到table别名里, 如果没有别名, 表名作为别名
  • 在parseInfo记录别名->表AST信息
  • 子查询
  • 检查子查询, 至少得有一个, 否则抛出异常
  • 递归

Where

Group By

  • 看看是否有Join有group by 之前, 可作优化使用

Having

  • 获取 <Agg, AST >, 并设置

Order By

Limit

生成逻辑查询计划(genPlan)

  • 递归生成子查询的查询计划
  • 生成Table的逻辑查询计划
  • 生成View的逻辑查询计划
  • 处理Join