1.数据倾斜原因
a.大表(2.8G)与小表关联(580K)
b.大表(2.8G)与大表(3.0G)关联
首先谈论大表与小表的关联导致数据倾斜问题
实例如下:
大表数据格式:
小表数据格式:
关联语句
hive>select * from report_tour_spot_detail s join report_tour_msg_detail r on s.scenicid=r.scenicid;
上面情况会产生数据倾斜,原因:由于大表与小表数据量相差3000倍,遍历整个过程需要大表数据条数X小表的数据条数=总量。这样会导致数据严重倾斜。具体表现:后台数据写入一直出去某种状态如控制台一直处于38%处理状态。二,磁盘的容量被大量占用,严重会导致集群崩溃。
解决方案:左右表关联查询将小表置于左侧。这样其数据先读入磁盘中(原理仅用map在磁盘中处理),减少线上(reduce)数据处理的压力。
大表与大表关联查询
大表格式:
大表格式:
hive>select /*+ MAPJOIN(b) */ s.tourname, s.rank, s.spotname, s.spotprovince, s.spotcityname, s.tourtype, r.sex, r.birthday, r.tel, r.certificate_no, r.close_total_price, r.occ_date
from scenic_info_detail s join report_tour_msg_detail r on s.scenicid=r.scenicid;
原因:由于两张表中scenicid字段中分别存在大量的重复数据。如1105字段在scenic_info_detail表中有大量的重复。而在report_tour_msg_detail表中scenicid字段也有重复的数据,二者对该字段关联查询时导致数据倾斜。