hive编程是整个数据仓库操作的核心,而各种业务之间的join是hive的核心,所以熟练明白滴掌握hive中的各种join是数据仓库开发工程师必备的技能。   

hive中的join只支持等值join,也就是说join on中的on里面表之间连接条件只能是=,不能是<,>等符号。此外,on中的等值连接之间只能是and,不能是or. (如果在on 里添加非表之间的条件可以是非等号,下面有演示)

     为了演示各种join之间的关系以及使用注意事项,准备如下三个表,以及表中数据。

表1:CREATE  TABLE `FDM_SOR.mytest_department`(`dept_no` int, `dept_name` string) row format delimited fields terminated by ','表2:CREATE  TABLE `FDM_SOR.mytest_staffinfo`(`id` int, `name` string,sex   string,dept_no int )row format delimited fields terminated by ','表3:CREATE  TABLE `FDM_SOR.mytest_deptaddr`(`dept_no` int, `addr` string, `tel` string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
如下对应的各表中load的数据
`FDM_SOR.mytest_staffinfo
001,'tom','man',101
002,'jerry','man',103
003,'marry','woman',101
004,'tom','man',104
005,'jebby','man',102
006,'smiiss','man',101
007,'dosos','man',102
008,'tiny','woman',102
009,'feyy','woman',104
010,'feyy','woman',103
011,'cake','man',101
012,'dogy','man',102
013,'gaayy','man',105
014,'kety','man',
015,'caggyy','man',104
016,'addy','man',106
017,'nancy','man',104
018,'tom','man',101FDM_SOR.mytest_department
101,'it'
102,'finance'
103,'mannager'
104,'dining'
105,'boss-office'
107,'enjoy'
108,'fun'FDM_SOR.mytest_deptadd
109,'new york109','931232323'
108,'new york108','431232323'
107,'new york107','531232323'
106,'new york106','531232323'
101,'new york101','431232323'
104,'new york104','131232323'
103,'new york103','131232323'
102,'new york102','131232323'
105,'new york105','131232323'

1.inner join(内连接,只有进行连接的两个表中都存在与连接条件相匹配的数据才会被留下来) 

 内连接是最常见的一种连接,它页被称为普通连接,而E.FCodd最早称之为自然连接。其中inner可以省略。inner join == join 等价于早期的连接语法

select a.id ,a.name,b.dept_no,b.dept_namefrom FDM_SOR.mytest_staffinfo a  inner join  FDM_SOR.mytest_department  bon a.dept_no = b.dept_no等价于 inner join内连接的另外一种写法,效果一样。select a.id ,a.name,b.dept_no,b.dept_namefrom FDM_SOR.mytest_staffinfo a  ,FDM_SOR.mytest_department  bwhere a.dept_no = b.dept_no1 'tom' 101 'it'2 'jerry'   103 'mannager'3   'marry'   101 'it'4 'tom' 104 'dining'5 'jebby'   102 'finance'6    'smiiss'101   'it'7 'dosos'   102 'finance'8    'tiny'    102 'finance'9    'feyy'    104 'dining'10    'feyy'    103 'mannager'11  'cake'    101 'it'12    'dogy'    102 'finance'13   'gaayy'   105 'boss-office'15   'caggyy'104   'dining'17    'nancy'   104 'dining'18    'tom' 101 'it'

如上,表1中工号16的员工,所在106部门,因为department中没有,所以其没有留下,同理14号员工因为没有部门,也没有存在。 同理department中部分编号107,108也没有留下,因为其在表staffinfo中没有,故没有留下。
------------------------------------------------------------------------------------------------------------------------------
2.left join 是左外连接(Left Outer Jion),其中outer可以省略,left outer join是早期的写法。
     A left join  B 是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.
     意思说,左表(A)的记录将会全部表示出来(不管右边的表中是否存在与它们匹配的行),而右表(B)只会显示符合搜索条件的记录,比如符合on,where中的条件。B表记录不足的地方均为NULL.    A  left   join   B   等价B   right   join   A  

select a.id ,a.name,b.dept_no,b.dept_name
from FDM_SOR.mytest_staffinfo a  left join  FDM_SOR.mytest_department  b
on a.dept_no = b.dept_no
1   'tom' 101 'it'
2   'jerry'   103 'mannager'
3   'marry'   101 'it'
4   'tom' 104 'dining'
5   'jebby'   102 'finance'
6   'smiiss'101   'it'
7   'dosos'   102 'finance'
8   'tiny'    102 'finance'
9   'feyy'    104 'dining'
10  'feyy'    103 'mannager'
11  'cake'    101 'it'
12  'dogy'    102 'finance'
13  'gaayy'   105 'boss-office'
14  'kety'    NULL    NULL
15  'caggyy'104   'dining'
16  'addy'    NULL    NULL
17  'nancy'   104 'dining'
18  'tom' 101 'it'

3.right join ,同理和left join相反,A right join B ,则显示B表中所有的记录,A表不足的用null填充
  同样 right outer join = right join ,outer可以省略。

select a.id ,a.name,b.dept_no,b.dept_name
from FDM_SOR.mytest_staffinfo a  right outer  join  FDM_SOR.mytest_department  b
on a.dept_no = b.dept_no
1   'tom' 101 'it'
3   'marry'   101 'it'
6   'smiiss'101   'it'
11  'cake'    101 'it'
18  'tom' 101 'it'
5   'jebby'   102 'finance'
7   'dosos'   102 'finance'
8   'tiny'    102 'finance'
12  'dogy'    102 'finance'
2   'jerry'   103 'mannager'
10  'feyy'    103 'mannager'
4   'tom' 104 'dining'
9   'feyy'    104 'dining'
15  'caggyy'104   'dining'
17  'nancy'   104 'dining'
13  'gaayy'   105 'boss-office'
NULL    NULL    107 'enjoy'
NULL    NULL    108 'fun'

4. full outer join 等价 full join  ,全外连接

   包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行  在功能上,它等价于对这两个数据集合分别进行左外连接和右外连接,然后再使用消去重复行的并操作将上述两个结果集合并为一个结果集。

select a.id ,a.name,b.dept_no,b.dept_name
from FDM_SOR.mytest_staffinfo a  full  join  FDM_SOR.mytest_department  b
on a.dept_no = b.dept_no
order by a.id
NULL    NULL    107 'enjoy'
NULL    NULL    108 'fun'
1   'tom' 101 'it'
2   'jerry'   103 'mannager'
3   'marry'   101 'it'
4   'tom' 104 'dining'
5   'jebby'   102 'finance'
6   'smiiss'  101 'it'
7   'dosos'   102 'finance'
8   'tiny'    102 'finance'
9   'feyy'    104 'dining'
10  'feyy'    103 'mannager'
11  'cake'    101 'it'
12  'dogy'    102 'finance'
13  'gaayy'   105 'boss-office'
14  'kety'    NULL    NULL
15  'caggyy'  104 'dining'
16  'addy'    NULL    NULL
17  'nancy'   104 'dining'
18  'tom' 101 'it'

5.自连接是自身连接,指同一个表自己与自己进行连接。这种一元连接通常用于从自反关系(也称作递归关系)中抽取数据
6.外连接与条件配合使用

当在内连接(join或者inner join)查询中加入条件时,无论是将它加入到join子句,还是加入到where子句,其效果是完全一样的,比如:

select a.id ,a.name,b.dept_no,b.dept_name
from FDM_SOR.mytest_staffinfo a  inner join  FDM_SOR.mytest_department  b
on a.dept_no = b.dept_no and a.id > 5
等价于
select a.id ,a.name,b.dept_no,b.dept_name
from FDM_SOR.mytest_staffinfo a  inner join  FDM_SOR.mytest_department  b
on a.dept_no = b.dept_no
where  a.id > 5
6   'smiiss'  101 'it'
7   'dosos'   102 'finance'
8   'tiny'    102 'finance'
9   'feyy'    104 'dining'
10  'feyy'    103 'mannager'
11  'cake'    101 'it'
12  'dogy'    102 'finance'
13  'gaayy'   105 'boss-office'
15  'caggyy'  104 'dining'
17  'nancy'   104 'dining'
18  'tom' 101 'it'

但对于外连接情况就不同了。加入的条件在join子句中和在where子句中效果完全不一样。
当把条件加入到 join子句时,SQL Server、Informix会返回外连接表的全部行,然后使用指定的条件返回第二个表的行。

如果将条件放到where子句中,SQL Server将会首先进行连接操作,然后使用where子句对连接后的行进行筛选。下面的两个查询展示了条件放置位子对执行结果的影响:

select a.id ,a.name,b.dept_no,b.dept_name
from FDM_SOR.mytest_staffinfo a  left join  FDM_SOR.mytest_department  b
on a.dept_no = b.dept_no and  a.id > 5
1   'tom' NULL    NULL
2   'jerry'   NULL    NULL
3   'marry'   NULL    NULL
4   'tom' NULL    NULL
5   'jebby'   NULL    NULL
6   'smiiss'  101 'it'
7   'dosos'   102 'finance'
8   'tiny'    102 'finance'
9   'feyy'    104 'dining'
10  'feyy'    103 'mannager'
11  'cake'    101 'it'
12  'dogy'    102 'finance'
13  'gaayy'   105 'boss-office'
14  'kety'    NULL    NULL
15  'caggyy'  104 'dining'
16  'addy'    NULL    NULL
17  'nancy'   104 'dining'
18  'tom' 101 'it'

如上,当将条件加入到where 子句后

select a.id ,a.name,b.dept_no,b.dept_name
from FDM_SOR.mytest_staffinfo a  left join  FDM_SOR.mytest_department  b
on a.dept_no = b.dept_no
where  a.id > 5
6   'smiiss'  101 'it'
7   'dosos'   102 'finance'
8   'tiny'    102 'finance'
9   'feyy'    104 'dining'
10  'feyy'    103 'mannager'
11  'cake'    101 'it'
12  'dogy'    102 'finance'
13  'gaayy'   105 'boss-office'
14  'kety'    NULL    NULL
15  'caggyy'  104 'dining'
16  'addy'    NULL    NULL
17  'nancy'   104 'dining'
18  'tom' 101 'it'

7.多表之间进行join时注意事项

select a.id ,a.name,b.dept_no,b.dept_name,c.addr,c.telfrom FDM_SOR.mytest_staffinfo a  inner join  FDM_SOR.mytest_department  b  on a.dept_no = b.dept_noinner join  FDM_SOR.mytest_deptaddr    c  on a.dept_no = c.dept_no ;
1   'tom' 101 'it'      ‘new york101'  '431232323'
2   'jerry'   103 'mannager'    'new york106' '131232323'
3   'marry'   101 'it'      'new york101' '431232323'
4   'tom' 104 'dining'  'new york101' '131232323'
5   'jebby'   102 'finance' 'new york102' '131232323'
6   'smiiss'101   'it'      'new york101' '431232323'
7   'dosos'   102 'finance' 'new york102' '131232323'
8   'tiny'    102 'finance' 'new york102' '131232323'
9   'feyy'    104 'dining'  'new york101' '131232323'
10  'feyy'    103 'mannager'    'new york106' '131232323'
11  'cake'    101 'it'      'new york101' '431232323'
12  'dogy'    102 'finance' 'new york102' '131232323'
13  'gaayy'   105 'boss-office''new york106'  '131232323'
15  'caggyy'104   'dining'  'new york101' '131232323'
17  'nancy'   104 'dining'  'new york101' '131232323'
18  'tom' 101 'it'     'new york101'  '431232323

注意:一般情况下,hive会给每个join对象启动一个mapreduce job进行执行,如上,一般会先启动一个mr job 进行a,b表的join,然后再启动一个mr job进行上面job产生的临时表与c表的join,但是对于3个及以上的多表join,join有所优化,如果每个join的子句on里的连接键一样,如上都是dept_no,那么这样的话,mr会启动一个job完成所有表的join.此外,多表进行join时,一般要把大表放到最后面,这样可以提高效率。
8.left semi join  左半开连接 ,会显示左半边表中记录,前提是其记录对于右半边表满足于on语句中判定条件。
   left semi join 效果和inner join 效果差不多,比inner join 效率更高。

select a.id ,a.name,a.dept_nofrom FDM_SOR.mytest_staffinfo a  where a.dept_no in (select dept_no  from FDM_SOR.mytest_departmentwhere dept_no > 102)
2   'jerry'   103
4   'tom' 104
9   'feyy'    104
10  'feyy'    103
13  'gaayy'   105
15  'caggyy'104
17  'nancy'   104
等价于下面的查询
select a.id ,a.name,a.dept_no
from FDM_SOR.mytest_staffinfo a  left semi join FDM_SOR.mytest_department  b
on a.dept_no = b.dept_no   and b.dept_no >1022  'jerry'   103
4   'tom' 104
9   'feyy'    104
10  'feyy'    103
13  'gaayy'   105
15  'caggyy'104
17  'nancy'   104select a.id ,a.name,a.dept_no
from FDM_SOR.mytest_staffinfo a  left semi join FDM_SOR.mytest_department  b
on a.dept_no = b.dept_no
where a.dept_no > 1022   'jerry'   103
4   'tom' 104
9   'feyy'    104
10  'feyy'    103
13  'gaayy'   105
15  'caggyy'104
17  'nancy'   104select a.id ,a.name,a.dept_no
from FDM_SOR.mytest_staffinfo a  left semi join FDM_SOR.mytest_department  b
on a.dept_no = b.dept_no   where b.dept_no > 102   -----报错。select 和where子句中不能引用右边表中的字段。
最后附上hive中各种join之间的关系一览图。

轻松玩转hive中各种join之间的关系以及使用相关推荐

  1. 商品期货中各种品种之间的关系研究

    商品期货中各种品种之间的关系研究 作者:来源:时间:2018-12-01 14:01:14 在产品期货买卖中,许多种类之间会出现着不同程度的相关联系,有时分是由于同种原因导致的,比方说,社会全体需求增 ...

  2. 关于hive中Map join 时大表left join小表的问题

    在hive中,(启用Map join时) 大表left join小表,加载从右向左,所以小表会加载进内存,存储成map键值对,通过大表驱动小表,来进行join,即大表中的join字段作为key 来获取 ...

  3. Hive中Left join的不等连接如何改写?

    目录 0 前言 1 需求案例 2 问题分析 0 前言 我们都知道oracle,mysql或greenplum中都支持不等连接,但在hive数据库中2.1之前的版本是不支持的,那么对一些需要不等连接的语 ...

  4. 摄像机标定中四大坐标系之间的关系

    一.四个坐标系简介和转换 相机模型为以后一切标定算法的关键,只有这边有相当透彻的理解,对以后的标定算法才能有更好的理解.本人研究了好长时间,几乎每天都重复看几遍,最终才会明白其推导过程.      我 ...

  5. 学会这一招,轻松玩转 app 中混合应用自动化测试

    现在的 app 中越来越多的页面通过 H5 来做了,理由很简单,不需要升级 app 就能让用户使用新的功能.这就苦了我们测试工程师了,混合应用自动化不会玩.今天咱们来聊一聊 app 中混合应用自动化怎 ...

  6. outlook 签名_快速提示:轻松在Outlook 2007中的签名之间切换

    outlook 签名 There are many people who live in Microsoft Outlook a good percentage of the day. You mig ...

  7. ios 渐变透明背景_Web设计新趋势 | 教你轻松玩转设计中渐变~

    点击上面的蓝字关注我们哦! 在网页设计中使用渐变的趋势时有发过好几次.如果你浏览了这些年来网页设计趋势的各种列表,你会发现经常包含很多种渐变.多年来,它们在网页设计中的使用方式已经从我们现在认为俗气的 ...

  8. 网络中的计算机之间的关系,有关服务器与主机之间的关系

    局域网,是指"存在于某一个较小地理区域内的计算机网络".通常把两台以上的电脑通过各种介质(比如双绞线.同轴电缆.电话线等等,空气也算是一种介质,这就是无线网络)连接起来,这就构成了 ...

  9. javascript中的对象之间继承关系

    相信每个学习过其他语言的同学再去学习JavaScript时就会感觉到诸多的不适应,这真是一个颠覆我们以前的编程思想的一门语言,先不要说它的各种数据类型以及表达式的不同了,最让我们头疼,恐怕就是面向对象 ...

最新文章

  1. 使用谷歌Colab Notebooks,这6个小技巧你需要掌握
  2. 网络编程学习笔记(TCP回射服务器程序修订版)
  3. 笔记-项目整体管理-复习要点
  4. 【NLP】机器如何认识文本 ?NLP中的Tokenization方法总结
  5. 面向对象程序设计c 语言描述 答案,c面向对象程序设计习题解答全.doc
  6. python用字典统计单词出现次数_python - 如何使用字典理解来计算文档中每个单词的出现次数...
  7. 摩拜前端周刊第15期
  8. python3 输出系统信息
  9. 云账房签约葡萄城,开启 “在线Excel+智能财税” 时代
  10. 网站常用组件收集整理
  11. ISO20000/ISO27001认证区别和证书展示
  12. java 格雷码_在 Java 中使用递归的方式将二进制转换为等效的格雷码
  13. html css画圆形进度条,使用 css3 实现圆形进度条的方法
  14. excel如何实现中文单词自动翻译成英文?这个公式教你了
  15. 国际及港澳台电话国家代码表
  16. shopee虾皮面试题汇总-C++后端
  17. 嵌入式Linux资源网站,嵌入式Linux名词及资源
  18. html5调用手机震动
  19. 点餐小程序实战教程03-店铺信息展示
  20. JavaPoet 的使用

热门文章

  1. 乐视之殇——谁能拯救这个梦想成为英雄的民营企业?
  2. 联想笔记本触摸板故障处理
  3. excel转换 txt竖线分隔符 为 xlsx 转换为 csv
  4. 大容量存储方案_数字视频监控大容量存储解决方案
  5. vscode配置java_VS Code 配置 Java IDE
  6. 万彩动画大师使用技巧_在设计中使用动画的4个技巧
  7. 关于功率的理解与记录
  8. Gatling学习笔记(四)---脚本编写及功能介绍
  9. 浏览器http无法调用摄像头,https才支持调用摄像头
  10. 实现OPC UA publish/subscribe单次发送