IT技术博客大学习 共学习 共进步

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

淘宝数据平台与产品部官方博客 tbdata.org 2011-04-28 13:23:07 浏览 6,942 次

    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. 如何获取hive建表语句 (阅读 7,122)
  2. HIVE中UDTF编写和使用 (阅读 5,882)
  3. Hive的入口 -- Hive源码解析 (阅读 5,822)
  4. Hive源码解析-之-语法解析器 (阅读 5,522)
  5. 用hadoop hive协同scribe log用户行为分析方案 (阅读 4,961)
  6. 几个HIVE的streaming (阅读 4,281)
  7. Impala与Hive的比较 (阅读 4,042)
  8. 写好Hive 程序的五个提示 (阅读 3,924)
  9. Hive 随谈(一) (阅读 3,460)
  10. Hive 随谈(二) (阅读 3,361)