Hive基础(join原理和机制,join的几种类型,数据倾斜简单处理)

本文详细介绍了Hive中的Join原理,包括Common Join和Map Join的工作机制。接着,阐述了Hive支持的多种Join类型,如内关联、左外关联、右外关联、全外关联及左半连接,并给出了数据倾斜的现象、原因和常见解决办法,如调整Join顺序、设置参数和避免COUNT DISTINCT等操作引起的数据倾斜。
摘要由CSDN通过智能技术生成
                                                        <h2>

一,Hive中join的原理和机制

Hive中的Join可分为Common Join(Reduce阶段完成join)和Map Join(Map阶段完成join)。

Hive Common Join
如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会默认把执行Common Join,即在Reduce阶段完成join。整个过程包含Map、Shuffle、Reduce阶段。

Map阶段
读取源表的数据,Map输出时候以Join on条件中的列为key,如果Join有多个关联键,则以这些关联键的组合作为key;Map输出的value为join之后所关心的(select或者where中需要用到的)列,同时在value中还会包含表的Tag信息,用于标明此value对应哪个表。 Shuffle阶段
根据key的值进行hash,并将key/value按照hash值推送至不同的reduce中,这样确保两个表中相同的key位于同一个reduce中。 Reduce阶段
根据key的值完成join操作,期间通过Tag来识别不同表中的数据。

以下面的HQL为例,图解其过程:

?

1
2
3
SELECT
a.id,a.dept,b.age
FROM
a join b
ON
(a.id = b.id);

join原理

Hive Map Join
MapJoin通常用于一个很小的表和一个大表进行join的场景,具体小表有多小,由参数hive.mapjoin.smalltable.filesize来决定,默认值为25M。满足条件的话Hive在执行时候会自动转化为MapJoin,或使用hint提示 /*+ mapjoin(table) */执行MapJoin。
mapjoin

如上图中的流程,首先Task A在客户端本地执行,负责扫描小表b的数据,将其转换成一个HashTable的数据结构,并写入本地的文件中,之后将该文件加载到DistributeCache中。
接下来的Task B任务是一个没有Reduce的MapReduce,启动MapTasks扫描大表a,在Map阶段,根据a的每一条记录去和DistributeCache中b表对应的HashTable关联,并直接输出结果,因为没有Reduce,所以有多少个Map Task,就有多少个结果文件。
注意:Map JOIN不适合FULL/RIGHT OUTER JOIN。

二,join的几种类型

Hive中除了支持和传统 数据库 中一样的内关联(JOIN)、左关联(LEFT JOIN)、右关联(RIGHT JOIN)、全关联(FULL JOIN),还支持左半关联(LEFT SEMI JOIN)。
注意:Hive中Join的关联键必须在ON()中指定,不能在Where中指定。
数据准备:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
hive> desc
lxw1234_a;
OK
id                      string                                     
name                     string                                     
Time
taken: 0.094 seconds, Fetched: 2 row(s)
hive> select
* from lxw1234_a;
OK
1       zhangsan
2       lisi
3       wangwu
Time
taken: 0.116 seconds, Fetched: 3 row(s)
hive> desc
lxw1234_b;
OK
id                      string                                     
age                     int                                         
Time
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值