一、一个SQL语句分析
SELECT a.Key
, SUM(a.Cnt) AS Cnt
FROM (
SELECT Key
, COUNT(*) AS Cnt
FROM TableName
GROUP BY Key,
CASE
WHEN Key = 'KEY001' THEN Hash(Random()) % 50
ELSE 0
END
) a
GROUP BY a.Key;
解释:这个SQL其实是一个解决数据倾斜的SQL
先看里面的select语句,里面的select语句其实是根据key进行分组,但是这个key对应的数据存在数据倾斜,key=KEY001的数据占了整份数据的90%,所以直接针对key进行分组肯定会出现数据倾斜,应该计算效率,所以在这里就实现了曲线救国,先把key=KEY001的数据打散,分成50份,进行局部聚合。
最后再通过外面的select进行全局的聚合,这样就可以显著提高计算效率
二、Hive数据倾斜的解决方案
1、触发Hive数据倾斜几种情况
关键字 情形 后果
join 其中一个表较小,但是key