大数据全系列 教程
1869个小节阅读:464.8k
目录
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
Hive Join
官网搜索:join->LanguageManual Joins
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins
xxxxxxxxxx
join_table:
table_reference [INNER] JOIN table_factor [join_condition]
| table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition
| table_reference LEFT SEMI JOIN table_reference join_condition
| table_reference CROSS JOIN table_reference [join_condition] (as of Hive 0.10)
table_reference:
table_factor
| join_table
table_factor:
tbl_name [alias]
| table_subquery alias
| ( table_references )
join_condition:
ON expression
reduce side join
reduce side join是一种最简单的join方式,其主要思想如下: 在map阶段,map函数同时读取两个文件File1和File2,为了区分两种来源的key/value数据对,对每条数据打一个标签> (tag),比如:tag=1表示来自文件File1,tag=2表示来自文件File2。即:map阶段的主要任务是对不同文件中的数据打标签。> 在reduce阶段,reduce函数获取key相同的来自File1和File2文件的value list, 然后对于同一个key,对File1和File2中的数据进行join(笛卡尔乘积)。即:reduce阶段进行实际的连接操作。
map side join
之所以存在reduce side join,是因为在map阶段不能获取所有需要的join字段,即:同一个key对应的字段可能位于不同map中。Reduce side join是非常低效的,因为shuffle阶段要进行大量的数据传输。 Map side join是针对以下场景进行的优化:两个待连接表中,有一个表非常大,而另一个表非常小,以至于小表可以直接存放到内存中。这样,我们可以将小表复制多 份,让每个map task内存中存在一份(比如存放到hash table中),然后只扫描大表:对于大表中的每一条记录key/value,在hash table中查找是否有相同的key的记录,如果有,则连接后输出即可。
Join计算时,将小表(驱动表)放在join的左边
Map Join:在Map端完成Join
两种实现方式:
1、SQL方式,在SQL语句中添加MapJoin标记(mapjoin hint)
语法:
xxxxxxxxxx
SELECT /*+ MAPJOIN(smallTable) */ smallTable.key, bigTable.value
FROM smallTable JOIN bigTable ON smallTable.key = bigTable.key;
2、开启自动的MapJoin
大小判断标准,表数据的大小而不是行数。(通常行少的数据一般是小表)
xxxxxxxxxx
hive> set hive.ignore.mapjoin.hint;
hive.ignore.mapjoin.hint=true
hive.ignore.mapjoin.hint;默认为true,如果自动和手动冲突了,手动的配置失效,以自动配置为准。
将key相对分散,并数据量小的表放在join的左边,这样可以有效减少内存溢出发生的几率;还可以使用map join让小的维度表(1000条一下的记录数据)先进内存,在map端完成join。
测试发现新版的hive已经对小表join大表和大表join小表进行了优化,小表放在左边和右边已经没有明显的区别。
map join原理分析:
在Map端完成Join。如果不指定 MapJoin或者不符合MapJoin的条件,那么Hive解析器会将Join操作转换成CommonJoin,在reduce阶段完成join。容易发生倾斜。可以用MapJoin将小表全部加装到内存,在map端完成join,避免reducer处理。
相关配置参数:
(大表小表判断的阈值,如果表的大小小于该值则会被加载到内存中运行)
(默认值:true;是否忽略mapjoin hint 即mapjoin标记)
(默认值:true;将普通的join转化为普通的mapjoin时,是否将多个mapjoin转化为一个mapjoin)
(将多个mapjoin转化为一个mapjoin时,其表的最大值)
扩展:hive.groupby.skewindata 避免数据倾斜,一个MR变2个:MR->MR,先做一次数据合并,有时候一个MR都即将100%的时候卡着不动了,分两个完成。