• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

hive diligentman 3个月前 (08-29) 25次浏览

在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;OK1  a1  b2  a2  b3  a3  b4  bTime taken: 0.252 seconds, Fetched: 7 row(s)hive> select * from t2;OK1  aa2  ddTime 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>

 

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

 


程序员灯塔 , 版权所有
转载请注明原文链接:https://www.wangt.cc/2019/08/4f7c0875d6/
喜欢 (0)