在group by分组的时候,某个key过多导致数据倾斜

解决方案:将 key 打散,给 key 增加随机前缀

在进行 group by 之前,先给每个 user_id 增加一个随机前缀,使得原本相同的 user_id 被打散到不同的分组中。

按带前缀的 key 进行分组

对带有随机前缀的 user_id 进行分组和聚合。

去掉前缀后再分组

在第一步的基础上,去掉前缀,再进行一次分组和聚合,得到最终的结果。

插入数据:

CREATE TABLE t_table (
  id INT,
  key STRING,
  value INT
);

INSERT INTO t_table VALUES
(1, 'A', 1),
(2, 'B', 2),
(3, 'A', 3),
(4, 'A', 4),
(5, 'C', 5),
(6, 'D', 6),
(7, 'A', 7),
(8, 'E', 8),
(9, 'F', 9),
(10, 'A', 10);

select *
from t_table;

添加随机前缀:

去掉前缀查询:

select substr(new_key,5) as ori_key,total_value
from (SELECT concat(substr(md5(key),1,4),key) AS new_key, SUM(value) AS total_value
FROM t_table
GROUP BY concat(substr(md5(key),1,4),key)) t1 ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值