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优化中,将走的游刃有余。
今天先到这里,下次将分析 hive语法解析器,欢迎关注。
由于时间仓促或者水平有限如果有哪些不对的地方,欢迎指出。
微博:www.weibo.com/xiaodongdata @淘宝数据红门-马晓东
QQ : 448683559
建议继续学习:
- 如何获取hive建表语句 (阅读:6701)
- HIVE中UDTF编写和使用 (阅读:5285)
- Hive的入口 -- Hive源码解析 (阅读:4849)
- Hive源码解析-之-语法解析器 (阅读:4345)
- 用hadoop hive协同scribe log用户行为分析方案 (阅读:4153)
- 几个HIVE的streaming (阅读:3423)
- 写好Hive 程序的五个提示 (阅读:3185)
- Hive 随谈(一) (阅读:2860)
- Impala与Hive的比较 (阅读:3014)
- Hive 随谈(二) (阅读:2642)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:hongmen 来源: 淘宝数据平台与产品部官方博客 tbdata.org
- 标签: Hive parser 词法分析
- 发布时间:2011-04-28 13:23:07
- [70] Twitter/微博客的学习摘要
- [65] find命令的一点注意事项
- [64] 如何拿下简短的域名
- [64] IOS安全–浅谈关于IOS加固的几种方法
- [63] android 开发入门
- [62] 流程管理与用户研究
- [62] Go Reflect 性能
- [60] Oracle MTS模式下 进程地址与会话信
- [59] 图书馆的世界纪录
- [58] 读书笔记-壹百度:百度十年千倍的29条法则