hive sql 的总结分析

旨在对hive sql整体总结记录 todo 总结
一、hive 的不同种类的join

Hive中除了支持和传统数据库中一样的内关联、左关联、右关联、全关联,union 支持LEFT SEMI JOIN和CROSS JOIN,但这两种JOIN类型也可以用前面的代替

注意:Hive中Join的关联键必须在ON ()中指定,不能在Where中指定,否则就会先做笛卡尔积,再过滤。

数据准备:
表一 、

hive> select * from lxw1234_a;
id       name
1       zhangsan
2       lisi
3       wangwu

表二、

hive> select * from lxw1234_b;
id     name
1       30
2       29
4       21

1、join的内关联
只能返回能关联上的结果数据

SELECT a.id,
a.name,
b.age 
FROM lxw1234_a a 
join lxw1234_b b 
ON (a.id = b.id);
 
--执行结果
1       zhangsan        30
2       lisi    	         29

2、左外关联(left [outer] join)
left [outer] join 关键词前面的表作为主表 (左表),和其它的表进行关联,返回记录和主表记录数一致,关联不上的字段置为NULL
注: outer 字段可以选择有无对产线无影响

SELECT a.id,
a.name,
b.age 
FROM lxw1234_a a 
left join lxw1234_b b 
ON (a.id = b.id);
 
--执行结果:
1   zhangsan   30
2   lisi       29
3   wangwu   NULL

3、右外关联(RIGHT [outer] JOIN)
和左外关联相反,以 RIGTH [OUTER] JOIN关键词后面的表作为主表,和前面的表左关联,返回记录数和主表一致,关联不上字段为NULL**(次和 左外关联不同的是 id 因为关联不上 所以赋值为NULL 其它字段(左表没有的)默认右表的值 ,左外关联 Id 关联字段没关联上区左表的值 )**

SELECT a.id,
a.name,
b.age 
FROM lxw1234_a a 
RIGHT OUTER JOIN lxw1234_b b 
ON (a.id = b.id);
 
--执行结果:
1          zhangsan    30
2          lisi    	   29
NULL       NULL    	   21

4、全外关联 (FULL [OUTER] JOIN)
描述: 以两个表的记录为基准,返回两个表的记录去重之后的之和。关联不上的字段为NULL.
注意:FULL JOIN 过程中,hive不会使用mapJOIN 来优化

SELECT a.id,
a.name,
b.age
FROM lxw1234_a a
FULL OUTER JOIN lxw1234_b b
ON (a.id = b.id);

–执行结果:
1 zhangsan 30
2 lisi 29
3 wangwu NULL
NULL NULL 21

5、笛卡尔积关联 (cross join)
返回两个表的笛卡尔积结果,不需要指定关联键。

例如:

SELECT a.id,
a.name,
b.age 
FROM lxw1234_a a 
CROSS JOIN lxw1234_b b;
结果为:
1       zhangsan        30
1       zhangsan        29
1       zhangsan        21
2       lisi    30
2       lisi    29
2       lisi    21
3       wangwu  30
3       wangwu  29
3	 wangwu  21

6、union

用来合并多个select 的查询结果,需要保证select 中的字段须要一致,每个select 语句返回的列的名字和数量和名字必须一样。否则,异常会被抛出。

注意:
Hive 1.2.0之前的版本仅支持UNION ALL,其中重复的行不会被删除。
Hive 1.2.0和更高版本中,UNION的默认行为是从结果中删除重复的行。

例子:

SELECT u.id, actions.date
FROM (
    SELECT av.uid AS uid
    FROM action_video av
    WHERE av.date = '2008-06-03'
    UNION ALL
    SELECT ac.uid AS uid
    FROM action_comment ac
    WHERE ac.date = '2008-06-03'
 ) actions JOIN users u ON (u.id = actions.uid)
test1数据:
hive> select * from test1;
OK
ios aa
ios ab
adr ac
adr ad
adr ad
ios ab
test2数据:

hive> select * from test2;
OK
ios ba
ios bb
adr ac
adr bd
adr bd
ios ab

使用union all关键字合并:
不会删除重复行

hive> select * from
(
   select platform, id from test1
   union all
   select platform, id from test2
) test;
OK
ios aa
ios ab
adr ac
adr ad
adr ad
ios ab
ios ba
ios bb
adr ac
adr bd
adr bd
ios ab

使用union 关键字合并:
会删除重复行

hive>select * from
(
   select platform, id from tmp_union_aa
   union
   select platform, id from tmp_union_ab
) u;
OK
adr ac
adr ad
adr bd
ios aa
ios ab
ios ba
ios bb

注意:hive的Union All相对sql有所不同,要求列的数量相同,并且对应的列名也相同,但不要求类的类型相同(可能是存在隐式转换吧)

refer https://my.oschina.net/leejun2005/blog/75722

猜你喜欢

转载自blog.csdn.net/weixin_40809627/article/details/106784424