技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 源码分析 --> Hive源码解析-之-词法分析器 parser

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

浏览:5814次  出处信息

    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建表语句    (阅读:6695)
  2. HIVE中UDTF编写和使用    (阅读:5275)
  3. Hive的入口 -- Hive源码解析    (阅读:4805)
  4. Hive源码解析-之-语法解析器    (阅读:4289)
  5. 用hadoop hive协同scribe log用户行为分析方案    (阅读:4143)
  6. 几个HIVE的streaming    (阅读:3408)
  7. 写好Hive 程序的五个提示    (阅读:3177)
  8. Hive 随谈(一)    (阅读:2853)
  9. Impala与Hive的比较    (阅读:2956)
  10. Hive 随谈(二)    (阅读:2632)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1