mysql数据倾斜_Hive SQL 数据倾斜总结

在海量数据下的数据查询中,数据倾斜是一个很恐怖的场景。常常看似很普通的数据查询,运行了几个小时也没有结果,其原因往往是发生了数据倾斜。如果真对数据倾斜采取相应的解决方法,那么查询效率将会大大提高。所以,分析数据倾斜是一件相当有意义的任务。本文总结不同情况下的数据倾斜,并分别给出解决方法。

数据倾斜

数据倾斜的实质,是hadoop在mr过程中,对key分发不均匀,导致某些节点上的任务明显比其他节点多,结果就是hadoop的多数节点空闲,而少数节点不停在运行。这样就大大降低了任务执行的效率,延长了执行时间。

数据倾斜主要由两种原因造成。一种是数据本身热点和非热点差异很大,存在长尾。比如10亿条的数据,大部分都属于少量的key,而其他大部分key都只占很少的数据量。这样在分发key的过程中,大量相同key的数据将会被集中到少量节点,从而造成数据倾斜。这种情况下,需要提前确定热点数据和非热点数据,分开处理。

另外一种造成数据倾斜的原因,是在join过程中,表之间的关联的key造成的。下面重点分析这种情况.

Join中的数据倾斜

有两种情况的join会造成数据倾斜,最常见的是大表和小表(作为从表)的join,这种情况下,大表中大量的key因为找不到小表中的匹配而分发不均匀。这种情况下,需对小表使用Mapjoin,将小表提前写入内存,并将join操作提前到map端执行,从而避免数据倾斜。

select /*+mapjoin(b)*/

a.c2,

b.c3

from

(select c1, c2 from t_large)a

left join

(select c1, c3 from t_small)b

on a.c1 = b.c1

另一种情况是当表中空值过多,在分发key的时候,空值聚集造成长尾。这种情况可以将空值处理成随机值,避免被分发至一处。

select ...

from

(select * from t_large_1)a

left join

(select * from t_large_2)b

on coalsece(a.id, rang()*9999) = b.id

-- coalsece方法处理a.id为null的情况

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL 中 Key 分区和 HASH 分区是两种不同的表分区方法。 Key 分区是根据分区键(也就是表中的某一列)的值来决定将行存储在哪个分区中。可以使用数值、日期或时间类型的列作为分区键。例如,可以将数据按照日期分区,将每个月的数据存储在一个分区中。 HASH 分区是根据分区键的哈希值来决定将行存储在哪个分区中。这种方法通常用于数据量较大的表,因为它可以将数据均匀地分布在各个分区中,减少碎片。但是,HASH 分区不能使用日期或时间类型的列作为分区键,也不能对分区进行范围查询。 总的来说,Key 分区更适用于日期或时间类型的数据,而 HASH 分区更适用于大量数据的情况,但是它不能进行范围查询。 ### 回答2: MySQL中的Key分区和HASH分区是两种不同的表分区方式。 Key分区是根据指定列的取值范围将表数据划分成若干分区。在创建表时,可以通过指定分区键来定义Key分区。分区键可以是整数、日期等类型的列。Key分区的主要特点是可以根据指定的列值迅速定位到对应的分区,因此适合于范围查询。当新数据插入时,系统将根据分区键的取值范围决定将数据插入到哪个分区中。Key分区的缺点是分区键的选择非常重要,如果选择不当可能导致数据分布不均匀,进而影响查询性能。 HASH分区是根据指定列的哈希值将表数据划分成若干分区。在创建表时,可以通过指定分区键来定义HASH分区。分区键可以是整数、字符串等类型的列。HASH分区的主要特点是可以将数据均匀地分布到各个分区中,因此适合于随机访问。当新数据插入时,系统将根据分区键的哈希值决定将数据插入到哪个分区中。HASH分区的缺点是无法支持范围查询,因为数据的分布是随机的,必须查询所有的分区才能得到完整的结果。 总的来说,Key分区适合于范围查询,HASH分区适合于随机访问。具体选择哪种分区方式要根据具体的业务需求和查询模式来决定。 ### 回答3: MySQL中的分区是将表分割为更小的、可管理的部分,以提高查询效率和管理性能。在MySQL中,Key分区和HASH分区是两种常见的分区方式。 首先,Key分区是基于表中的一个或多个列的值来进行分区的。它使用确定的算法将分区键的值映射到相应的分区中。这种分区方式适用于具有明确定义的范围或离散值的列,例如日期范围或状态值。Key分区可以使得查询只需要扫描特定的分区而不是整个表,提高查询性能。 而HASH分区是基于分区键的哈希值来进行分区的。它使用哈希算法将分区键的值转换为固定长度值,并根据这个值将数据分配到不同的分区中。这种分区方式适用于分区键的值分布比较均匀,且查询频率比较平衡的情况。HASH分区可以保证数据在各个分区中均匀分布,避免数据倾斜的问题。 总结来说,Key分区是基于列的值范围或离散值进行分区的,适用于有明确定义范围的列;而HASH分区是基于哈希值进行分区的,适用于分区键分布较为均匀的情况。两者适用的场景有所差异,根据具体需求选择合适的分区方式可以提高查询效率和管理性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值