Hive产生数据倾斜的原因有两个,
一个是group by分组聚合时某一个key或者空值对应的value数据量过大导致,只需要开启一个map-side(预聚合)参数即可解决
另一种就是join时产生的数据倾斜,join又分为两种场景
场景一:大表join小表
比如在数仓中,事实表join维度表(订单表join地区表),这种场景下产生的数据倾斜只需要开启mapjoin即可
set hive.auto.convert.join=true;
set hive.mapjoin.smalltable.filesize=250000;
场景二:大表join大表
解决方法①:启用smb join,意思是分桶有序的join,要求桶和桶之间必须是相同或者倍数的关系
解决方法②:启用skew join,对于数据量大的key加随机数,二次聚合
解决方法③:左表随机,右表扩容,左表数据量大的key加随机数,发往不同的Reducer进行处理
以上三种解决方法并不能很好的去解决大表join大表的问题,只能平时应急使用,如果想从根本上解决问题的话,还是需要在数仓建模的过程中去解决
解决方法④:数仓建模
对于需要两张大的事实表join才能得到的表,在建模时直接考虑使用累积性快照事实表,原本很大的两张表,每天把增量数据做一个join,相对来说效率要高很多
以上就是解决Hive数仓里数据倾斜问题的方法啦