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