Hive源码解析之词法分析器parser

Hive源码解析系列–词法分析器parser

接着上次的Hive解析走,上次分享的 < hive源码解析之hive 入口>
一直在忙hive sql优化,所以对sql语法解析关注的多一些,词法解析器+语法解析器。

这次说说基于hive源码说说的词法解析器,而对于分析重点还是正常SQL解析,而非ddl,set 等。
词法分析器 parser

在是一个简单的类图:

ParserDriver是词法解析的开始,< hive源码解析之hive 入口> cliDriver 中在所介绍的把hive sql分为五种情况处理,将正常的sql 语句(select .. from ..)传递给ParserDriver,再由antlr 生成语法树。
期间用到一些辅助类,基本上都是为antlr 生成语法树做相应的准备,包括 HiveLexerX进行大小写转化,TokenRewriteStream、antlrNOCaseStringStream 都是继承antlr内部类的方法,将其字符串转成唯一对应的Token 流,为生成语法树据做准备。

因为词法解析器主要通过 Antrl 生成语法树。
词法解析,其实是给sql各个元素给了hive内部可以认识并可以唯一标示的token。
主要调用antrl 的api,所以具体语法细节没有什么好说的,但是如何理解语法树是难点也是关键点。

举个例子:
这是个简单的语句树:

select t1.*,t2.value_data
from t_hm_ru_03 t1
join
( select * from s_base_values where pt = ’20110410000000′ and value_id = 888 ) t2
on t1.brand_id = t2.value_id;

生成语法树就会如下:

生成语法树:
ABSTRACT SYNTAX TREE:
(TOK_QUERY (TOK_FROM (TOK_JOIN (TOK_TABREF t_hm_ru_03 t1)
(TOK_SUBQUERY (TOK_QUERY (TOK_FROM (TOK_TABREF s_base_values))
(TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE))
(TOK_SELECT (TOK_SELEXPR TOK_ALLCOLREF))
(TOK_WHERE (and (= (TOK_TABLE_OR_COL pt) ’20110410000000′)
(= (TOK_TABLE_OR_COL value_id) 888))))) t2) (=
(. (TOK_TABLE_OR_COL t1) brand_id) (. (TOK_TABLE_OR_COL t2) value_id)))) (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE)) (TOK_SELECT (TOK_SELEXPR (TOK_ALLCOLREF t1)) (TOK_SELEXPR (. (TOK_TABLE_OR_COL t2) value_data)))))

在这里可以基本的看到from 被TOK_FORM 代替,等等。

提醒:
在这个过程中还没有列裁剪,*号还是被TOK_ALLCOLREF所标记,所以你在做hive优化或元数据解析的时候,需要自己做列裁剪,以取得最真实的数据。

##################################################################

为了让大家能够更直观的看出来、真切感受一下,我结合hive语法专门花时间花了一个语法树:

业务意义:

计算淘宝会员买家中,各种买家星级层次中,男性买家的数量。

sql实现:
Select  star_name, count(1) from users where pt = ’20110325000000′ and user_gender = 1 group by star_name;

Hive生成的语法树:
ABSTRACT SYNTAX TREE:
(
TOK_QUERY
(TOK_FROM (TOK_TABREF users))
(
TOK_INSERT
(TOK_DESTINATION (TOK_DIR TOK_TMP_FILE))
(TOK_SELECT (TOK_SELEXPR (TOK_TABLE_OR_COL star_name))
(TOK_SELEXPR (TOK_FUNCTION count 1)) )
(TOK_WHERE (and (= (TOK_TABLE_OR_COL pt) ’20110325′)
(= (TOK_TABLE_OR_COL user_gender) 1)))
(TOK_GROUPBY (TOK_TABLE_OR_COL star_name))
)
)

语法树(图形显示)

懂了词法分析器,知道了语法树是如何生成的,在以后的sql优化中,将走的游刃有余
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值