一.SQL中的连接
左连接:左边表的内容全部存在,左表在右表中没有匹配项的右边值为空
右链接:右边表的内容全部存在,右边在左表中没有匹配项的左边值为空
内连接:普通的连接操作,通过(= > <)等符号进行连接
全连接 :左右表数据都在,当对方表没有匹配项时数值为空
例子
a表 num name b表 num name a_num
1 zth 1 zjw 3
2 wn 2 dsf 1
3 xjk 3 nbd 4
左连接: select * from a left join b on a.num=b.a_num
结果 1 zth 2 dsf 1
2 wn null null null
3 xjk 1 zjw 3
右连接: select * from a right join b on a.num=b.a_num
结果 3 xjk 1 zjw 3
1 zth 2 dsf 1
null null null 3 nbd 4
全连接:select * from a full join b on a.num=b.a_num
结果 1 zth 2 dsf 1
2 wn null
3 xjk 1 zjw 3
null 3 nbd 4
二.Hive中的连接
1.INNER JOIN
2.LEFT OUTER JOIN
3.RIGHT OUTER JOIN
4.FULL OUTER JOIN
5.LEFT SEMI JOIN
6.map-side JOIN
前四个与上边的四个操作基本相同,第五个是Hive中的join方法左半开连接
第五个左半开连接只会返回左边的信息,他比通常的INNER JOIN 更加高效,因为左边表中指定的列一旦找到匹配选项,Hive就会立即停止扫描。从这点来看,左边表中选择的列是可以预测的(Hive中并没有右半开连接)
第六个map-site join 是这样的,假如连接的两个表中有一个表是很小的表,我们就可以把表加载到内存当中,这样就可以在map端完成连接过程从而省略掉了reduce的过程,因为hive可以和内存中的小表进行逐一的匹配
用法: 在select后面加 /*+MAPJOIN(小表的名字) */ 后边继续写
注意:这个功能默认是没有开启的需要设置一下参数 :set hive.optimize.bucketmapJOIN=true;
还可以设置小表的大小:set hive.mapjoin.smalltable.filesize = 25000000