赞
踩
Hive中有许多的Join操作,如果LEFT,RIGHT和FULL OUTER JOIN,INNER JOIN,LEFT SEMI JOIN等。那么它们都各自有什么特点呢?
感觉很难说明这些区别,还是通过例子来看。
如果我们有一个表,数据如下:
a.txt
1,a
2,b
3,c
4,d
7,y
8,u
另一个表中的数据如下:
b.txt
2,bb
3,cc
7,yy
9,pp
在Hive中建表:
create table a(id int,name string)
row format delimited fields terminated by ',';
create table b(id int,name string)
row format delimited fields terminated by ',';
导入数据:
load data local inpath '/root/a.txt' into table a;
load data local inpath '/root/b.txt' into table b;
SELECT * FROM a INNER JOIN b ON(a.id=b.id);
输出如下:
2 b 2 bb
3 c 3 cc
7 y 7 yy
就是求交集。
SELECT * FROM a LEFT OUTER JOIN b ON(a.id=b.id);
输出结果如下:
1 a NULL NULL
2 b 2 bb
3 c 3 cc
4 d NULL NULL
7 y 7 yy
8 u NULL NULL
把左边的表的记录都打印出来。
SELECT * FROM a RIGHT OUTER JOIN b ON(a.id=b.id);
输出如下:
2 b 2 bb
3 c 3 cc
7 y 7 yy
NULL NULL 9 pp
把右边的表的记录都打印出来。
SELECT * FROM a FULL OUTER JOIN b ON(a.id=b.id);
输出结果如下:
1 a NULL NULL
2 b 2 bb
3 c 3 cc
4 d NULL NULL
7 y 7 yy
8 u NULL NULL
NULL NULL 9 pp
两边的记录都会出来,如果没有的就填NULL。
SELECT * FROM a LEFT SEMI JOIN b ON(a.id=b.id);
输出结果如下:
2 b
3 c
7 y
SEMI在Hive中用的很广泛,用于实现Exist IN 子查询的。LEFT SEMI JOIN相当于Inner Join中取一半。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。