IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

淘宝数据平台与产品部官方博客 tbdata.org 2011-04-28 13:23:07 累计浏览 7,094 次
本机暂存

    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

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. 如何获取hive建表语句 (累计阅读 7,180)
  2. HIVE中UDTF编写和使用 (累计阅读 6,001)
  3. Hive的入口 -- Hive源码解析 (累计阅读 5,958)
  4. Hive源码解析-之-语法解析器 (累计阅读 5,741)
  5. UglifyJS有个不错的JavaScript解析器 (累计阅读 5,339)
  6. 用hadoop hive协同scribe log用户行为分析方案 (累计阅读 5,075)
  7. mysql数据库表名的大小写问题 (累计阅读 4,471)
  8. 几个HIVE的streaming (累计阅读 4,391)
  9. Impala与Hive的比较 (累计阅读 4,181)
  10. 写好Hive 程序的五个提示 (累计阅读 4,014)