数据倾斜

1.什么是数据倾斜?
数据按照某种分区规则后产生的分布不均匀状况,造成部分数据大量集中
比如:
银行按照面额点钱,10元1组,50元一组,100元一组,按面额分三人点钱,
如果100 元过多,则该名员工工作负荷也会大于其余两名
表现:
其他两人点完时, 100元还没有点完

2.容易产生数据倾斜的状况?
如 1 中 某面额过多,即 partioner 分区后某些分区内键值集中

3.产生数据倾斜的原因?
key 分区不均匀
业务数据本身特性:比如 针对 口红单品 时 ,男生和女生的消费状况
建表考虑维度少:比如 数钱时不只考虑 面额 一个维度,可以引入 批号数字 的取值区间 和 年限 做细分
查询语句本身存在数据倾斜:比如 只按面额 查询一堆钱不同面额的数量

4.怎么处理数据倾斜?
4.1 空值产生的数据倾斜,例如用户表中 用户ID 列 和 其他表的 用户ID 列关联作笛卡尔积
4.1.1 解决方法
4.1.1.1 过滤出左表 ID 列非空数据先与 右表 关联后再与左表过滤空值行拼接
select * from
tableleft L
join tableright R
on L.ID is not null
and L.ID = R.ID
union all
select * from
tableleft L
where L.ID is null
{要查表两次,效率较慢}

4.1.1.2 给空值列添加特定值
select * from
tableleft L
outer join tableright R
on
case when L.ID is null then concat(xxx,rand())
else L.ID = R.ID

4.2 大小表关联查询产生数据倾斜
4.2.1 使用map join解决小表关联大表造成的数据倾斜问题
将其中做连接的小表(全量数据)分发到所有 MapTask 端进行 Join

在 hive0.11 版本以后会自动开启 map join 优化,由两个参数控制:
set hive.auto.convert.join=true; //设置 MapJoin 优化自动开启
set hive.mapjoin.smalltable.filesize=25000000 //设置小表不超过多大时开启 mapjoin 优化

4.2.1.1 小表 关联 大表
直接将 小表 与 大表 关联

4.2.1.2 大表 关联 大表
将 左表 的 关联列 抽出与 右表 关联,
将 左表 与上述关联后的 联合表 关联

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值