打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【Hive】各种join连接用法

目录

一、简介

二、创建数据

1、数据概览

2、创建hive表并插入数据

三、join连接测试

1、join(inner join)

2、left join(left outer join)

3、right join(right outer join)

4、full join(full outer join)

5、left semi join

6、map side join

四、join 和 left semi join 的区别


一、简介

        hive join 主要包括join(内连接)、left join(左连接)、right join(右连接)、full join(全连接)、left semi join(左半连接)、map side join(map端连接)六种用法,其中inner join 和 join等价,left outer join 和 left join等价,right outer join 和 right join 等价,full outer join 和 full join等价。 正确选择合适的join 类型在开发过程中可以提升效率。

二、创建数据

1、数据概览

2、创建hive表并插入数据

  1. create table people(name string,age int) row format delimited fields terminated by ',';
  2. insert into people(name,age) values('Lucy',29);
  3. insert into people(name,age) values('Tom',26);
  4. insert into people(name,age) values('Lina',22);
  5. insert into people(name,age) values('Lili',18);
  6. insert into people(name,age) values('Jack',26);
  7. insert into people(name,age) values('Lihua',23);
  8. create table info(name string,address string) row format delimited fields terminated by ',';
  9. insert into info(name,address) values('Lucy','郑州');
  10. insert into info(name,address) values('Lili','北京');
  11. insert into info(name,address) values('Jack','上海');
  12. insert into info(name,address) values('Alice','南京');
  13. insert into info(name,address) values('Clarke','广州');
  14. insert into info(name,address) values('Lonnie','三亚');

三、join连接测试

1、join(inner join)

这里join 和 inner join等价;

  1. select t1.name,t1.age,t2.address from people t1 join info t2 on t1.name=t2.name;
  2. Lucy 29 郑州
  3. Lili 18 北京
  4. Jack 26 上海
  1. select t1.name,t1.age,t2.address from people t1 inner join info t2 on t1.name=t2.name;
  2. Lucy 29 郑州
  3. Lili 18 北京
  4. Jack 26 上海

2、left join(left outer join)

这里left join 和 left outer join 等价;

  1. select t1.name,t1.age,t2.address from people t1 left join info t2 on t1.name=t2.name;
  2. Lucy 29 郑州
  3. Lili 18 北京
  4. Jack 26 上海
  5. Tom 26 NULL
  6. Lihua 23 NULL
  7. Lina 22 NULL
  1. select t1.name,t1.age,t2.address from people t1 left outer join info t2 on t1.name=t2.name;
  2. Lucy 29 郑州
  3. Lili 18 北京
  4. Jack 26 上海
  5. Tom 26 NULL
  6. Lihua 23 NULL
  7. Lina 22 NULL

3、right join(right outer join)

这里right join 和 right outer join 等价;

  1. select t1.name,t1.age,t2.address from people t1 right join info t2 on t1.name=t2.name;
  2. Lucy 29 郑州
  3. NULL NULL 南京
  4. NULL NULL 广州
  5. Lili 18 北京
  6. NULL NULL 三亚
  7. Jack 26 上海
  1. select t1.name,t1.age,t2.address from people t1 right outer join info t2 on t1.name=t2.name;
  2. Lucy 29 郑州
  3. NULL NULL 南京
  4. NULL NULL 广州
  5. Lili 18 北京
  6. NULL NULL 三亚
  7. Jack 26 上海

4、full join(full outer join)

这里full join 和 full outer join 等价;

  1. select t1.name,t1.age,t2.name,t2.address from people t1 full join info t2 on t1.name=t2.name;
  2. NULL NULL Alice 南京
  3. NULL NULL Clarke 广州
  4. Jack 26 Jack 上海
  5. Lihua 23 NULL NULL
  6. Lili 18 Lili 北京
  7. Lina 22 NULL NULL
  8. NULL NULL Lonnie 三亚
  9. Lucy 29 Lucy 郑州
  10. Tom 26 NULL NULL
  1. select t1.name,t1.age,t2.name,t2.address from people t1 full outer join info t2 on t1.name=t2.name;
  2. NULL NULL Alice 南京
  3. NULL NULL Clarke 广州
  4. Jack 26 Jack 上海
  5. Lihua 23 NULL NULL
  6. Lili 18 Lili 北京
  7. Lina 22 NULL NULL
  8. NULL NULL Lonnie 三亚
  9. Lucy 29 Lucy 郑州
  10. Tom 26 NULL NULL

5、left semi join

  • left semi join是一个限制语句,join 右边表的字段不能出现在select或者where中。
  • left semi join是IN/EXISTS子查询的一种更高效的实现。
  • left semi join是in(keySet)的关系,遇到右表重复记录,左表会跳过,而 join 则会一直遍历。这就导致右表有重复值得情况下left semi join只产生一条,join会产生多条,所以left semi join的性能更高。 
  1. 等价语句:
  2. select t1.name,t1.age from people t1 left semi join info t2 on t1.name=t2.name;
  3. <==>
  4. select t1.name,t1.age from people t1 where t1.name in(select t2.name from info t2);
  5. <==>
  6. select t1.name,t1.age from people t1 where exists(select t2.name from info t2 where t1.name=t2.name);
  7. Lucy 29
  8. Lili 18
  9. Jack 26
  1. 错误示范【select后面出现join右边表的字段】:
  2. hive> select t1.name,t1.age,t2.name,t2.address from people t1
  3. left semi join info t2 on t1.name=t2.name;
  4. FAILED: SemanticException [Error 10004]: Line 1:22 Invalid table alias or
  5. column reference 't2': (possible column names are: name, age)

6、map side join

  • map side join使用场景是一个大表和一个小表的连接操作,其中,“小表”是指文件足够小,可以加载到内存中。该算法可以将join算子执行在Map端,无需经历shuffle和reduce等阶段,因此效率非常高。
  • map side join 需要hive更改配置文件,hive2.11版本默认是开着的:
  1. hive> set hive.auto.convert.join;
  2. hive.auto.convert.join=true
  3. hive> set hive.mapjoin.smalltable.filesize;
  4. hive.mapjoin.smalltable.filesize=25000000

四、join 和 left semi join 的区别

注意: left semi join是in(keySet)的关系,遇到右表重复记录,左表会跳过,而 join 则会一直遍历。这就导致右表有重复值得情况下left semi join只产生一条,join会产生多条,所以left semi join的性能更高。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
[一起学Hive]之十一-Hive中Join的类型和用法
hive的关联查询
Hive在左外关联(LEFTOUTERJOIN)上的一个重大缺陷
hive大数据倾斜总结
Hive学习之路 (十九)Hive的数据倾斜
SQL中的左连接与右连接,内连接有什么区别
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服