最近有重新回看了《Hadoop权威指南》,又想起来总结一些博文了,所以针对Hive常Hive数据连接及合并又仔细查了很多资料,写了这篇文章,还是一样,感谢各位在网络上的分享!!!
一.Hive连接:
Hive中的join只支持等值join,在join on中的on后的连接条件只能是“=”,不能是“<”或“>”等符号。并且,on中的等值连接只能是and,不能是or。
Hive中的common join也可称为reduce join或shuffle join。
1.内连接([inner] join):
内连接只会返回连接的两个表中所有符合连接条件的且两个表内都存在的数据且输入表之间的每次匹配都会在输出表中生成一行数据。
可以在连接谓词中使用and关键字分割一系列表达式来连接多个列,还可以在查询中使用多个join...on...子句连接多个表(Hive会智能地以最少的MapReduce作业数来执行连接)。
单个的连接用一个MapReduce作业实现,多个连接的连接条件中使用了相同的列,平均每个连接可以用少于一个MapReduce作业来实现。
2.外连接(left [outer] join,right [outer] join,full [outer] join):
外连接可以返回连接表中不能匹配的数据行。即使左(右)侧表中的有些行无法与所要连接的表中的任何数据行对应,查询还是会返回这个表中的每一个数据行,并且由于这个表在连接右(左)表中不存在,则在对应列为空值null,也就是左(右)外连接。同样的,全外连接是两个连接表中的所有行在输出中都有对应的行,即无论左表还是右表,只要是有对应连接中不存在,则会展示为空值null。
3.半连接(semi join):
对于common join而言,由于是在reduce端进行数据连接操作,则会极大消耗资源,所以在map端过滤掉一部分不需要参与join操作的数据。
left semi join:
在写left semi join时必须遵循的限制是右表只能在on子句中出现,即在where子句或select子句中设置过滤条件或查询条件都是不可以的。并且在使用left semi join时,遇到右表的重复数据,坐标会跳过,而common join on会纸质遍历。left semi join的查询结果数据只可能出现左侧表的数据,因为上述限制和实际上右侧表只参与了条件判断。
4.map连接(map join):
如果有一个连接表小到足以放入内存,Hive就可以把较小的表放在每个mapper的内存中进行连接操作。
common join和map join的区别及原因:
在common join中的map阶段,map端输出的key为join的条件,map输出的value为查询出来的字段信息。
在common join中的shuffle阶段,将map端输出的key进行hash,并且根据对应的hash值分配不同的reducer。
在common join中的reduce阶段,完成join操作。
执行map join查询时不需要使用reducer,会首先将小表转化并以HashTable文件形式存入缓存中。而后在map端只需要扫描大表中的每一行数据,而后每一行数据在缓存中与小表数据进行关联,而后直接输出结果。
原因:在MapReduce执行过程中shuffle阶段是非常耗费资源和时间的,此外由于排序的原因,可能会出现单个reduce处理单个key对应的极大的数据量的情况,即数据倾斜。
二.Hive合并:
union用于合并多个select的结果查询,必须保证select中字段一致,且每个select语句返回的数量和名字必须一样。
单独使用union会对两个结果集进行并集操作,不包括重复行。
使用union all同样会对两个结果集进行并集操作,但是包括重复行。