前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hive源码系列(十)编译模块之语义解析 数据准备

Hive源码系列(十)编译模块之语义解析 数据准备

作者头像
数据仓库践行者
发布2020-04-20 11:51:09
6690
发布2020-04-20 11:51:09
举报

在hive的源码apache-hive-2.1.1-src/data目录 下有测试数据以及脚本,进入该 目录执行 hive -f 'scripts/q_test_init.sql' 语句导入数据到hive,也可以自己创建数据表。

创建两张表:

use tmp;
create table t1 (id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
create table t2 (id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

数据:

hive> select * from t1;
OK
1  a
1  b
2  a
2  b
3  a
3  b
4  b
Time taken: 0.252 seconds, Fetched: 7 row(s)
hive> select * from t2;
OK
1  aa
2  dd
Time taken: 0.224 seconds, Fetched: 2 row(s)

阅读源码的技巧就是要有一定的目的性,抓住主线,不被其它无关条件干扰。不能漫无目的的看所有的代码,这样只会越看越蒙圈,到最后绝望到要放弃。

这次我们可以一条sql为主线,来串一下整个编译流程。

这条sql不必太复杂,太复杂了,我们看起来就会很吃力;但也不能太简单,太简单了,就跳过了太多的流程,阅读起来也没有太大的意义。

我们可以以下面的sql为例:

select 
  t1.id,
  t1.name,
  t2.name as name_t2 
from tmp.t1 t1 left outer join tmp.t2 t2 
on (t1.id=t2.id and t2.name='aa')  where t1.name='a';

语义解析主要是将 ASTTree 分模块存入QB,那么 ASTTree 就至关重要, ASTTree 上的每个元素我们都要关注到位。

该sql对应的ASTTree:

ASTNode:
nil
   TOK_QUERY
      TOK_FROM
         TOK_LEFTOUTERJOIN
            TOK_TABREF
               TOK_TABNAME
                  tmp
                  t1
               mt1
            TOK_TABREF
               TOK_TABNAME
                  tmp
                  t2
               mt2
            and
               =
                  .
                     TOK_TABLE_OR_COL
                        mt1
                     id
                  .
                     TOK_TABLE_OR_COL
                        mt2
                     id
               =
                  .
                     TOK_TABLE_OR_COL
                        mt2
                     name
                  'aa'
      TOK_INSERT
         TOK_DESTINATION
            TOK_DIR
               TOK_TMP_FILE
         TOK_SELECT
            TOK_SELEXPR
               .
                  TOK_TABLE_OR_COL
                     mt1
                  id
            TOK_SELEXPR
               .
                  TOK_TABLE_OR_COL
                     mt1
                  name
            TOK_SELEXPR
               .
                  TOK_TABLE_OR_COL
                     mt2
                  name
               name_t2
         TOK_WHERE
            =
               .
                  TOK_TABLE_OR_COL
                     mt1
                  name
               'a'
   <EOF>

在串的过程中,会有一些代码模块没有涉及到,这些没有涉及到的代码模块,我们就可以认为它们是无关紧要的,直接跳过。 等以后,如果用的到,再仔细深入的研究。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库践行者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档