转载:hive parser
来源:互联网 发布:阿里云建立个人网站 编辑:程序博客网 时间:2024/06/13 01:03
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语法解析器,欢迎关注。
由于时间仓促或者水平有限如果有哪些不对的地方,欢迎指出。
- 转载:hive parser
- Hive源码解析之词法分析器parser
- hive学习(转载)
- hive学习笔记-转载
- [转载]Hive日期函数
- 【转载】hive 差集
- Hive Hbase区别 转载整理
- Hive Hbase区别 转载整理
- Hive基础入门-架构(转载)
- Hive Hbase区别 转载整理
- Hive Hbase区别 转载整理
- (转载)hive文件存储格式
- 【hive】如何获取hive建表语句(转载)
- hive中partition如何使用(转载)
- hive和impala比较(转载)
- 转载hive中partition的一些知识
- 转载:Hive的安装以及使用
- (转载)详解Hive配置Kerberos认证
- 判断输入的各个数字是奇数还是偶数
- Implementing In-app Billing(转)
- grails hasMany一对多HQL查询问题
- 腾讯、百度、网易游戏、华为Offer及笔经面经
- js原型
- 转载:hive parser
- 给定一个字符串输出其全部排列的方法
- C++PRIMER 9-9
- 程序员需要有多懒 ?- cocos2d-x 数学函数、常用宏粗整理 - by Glede
- 判断一组数中 两两一对的数 后者是否是前者的倍数
- Security and Design(转)
- 在dblink对象上使用全局并行是无效,应使用普通形式
- META http-equiv 大全
- 计算a的b次方