0
点赞
收藏
分享

微信扫一扫

三维SDMTSP:GWO灰狼优化算法求解三维单仓库多旅行商问题,可以更改数据集和起点(MATLAB代码)

什么是分桶表?

 如何构建一个分桶表呢?

create table test_buck(id int,name string)
clustered by(id) sorted by (id asc) into 6 buckets --创建分桶表的sql
row format delimited fields terminated by '\t';

如何向分桶表添加数据呢?

分桶是如何提高效率的?

分桶和分区的区别:

分桶表有什么作用呢?

1.进行数据采样

2.提升查询的效率(单表|多表)

单表查询时,基于hash值进行分桶的机制下查询时可直接锁定对应桶,不需要全局扫描,节省查询时间,提高效率。

如何进行数据采样?

如何提升查询的效率?(多表查询)

思考: 当多表进行join的时候, 如何提升join效率呢?

 小表和大表:

如何开启map Join?
    set hive.auto.convert.join=true;  -- 是否开启map Join
    set hive.auto.convert.join.noconditionaltask.size=512000000; -- 设置小表最大的阈值(设置block cache 缓存大小)
    
map Join  不限制任何表 

为什么不采用reduce join呢?

中型表和大表:

中型表: 与小表相比 大约是小表3~10倍左右

解决方案:
1.能提前过滤就提前过滤掉(一旦提前过滤后,会导致中型表的数据量会下降,有可能达到小表阈值)
2.如果join的字段值有大量的null,可以尝试添加随机数(保证各个reduce接收数据量差不多的,减少数据倾斜问题)

3.基于分桶表的: bucket map join

bucket map join条件

1) set hive.optimize.bucketmapjoin = true;
2) 一个表的bucket数是另一个表bucket数的整数倍
3) bucket列 == join列
4) 必须是应用在map join的场景中

注意:如果表不是bucket的,则只是做普通join

在这种机制下减少中型表的数据量,将对应的join条件的数据放到内存中进行关联,map join还是在内存中进行,只不过对应的数据量减少了。

大表和大表:

解决方案:

1. 能提前过滤就提前过滤掉(减少join之间的数量, 提升reduce执行效率)。
2. 如果join的字段值有大量的null, 可以尝试添加随机数(保证各个reduce接收数据量差不多的, 减少数据倾斜问题)。

3. SMB Map join (sort merge bucket map join)

sort merge bucket map join 

实现SMB map join的条件要求: 
1) 一个表的bucket数等于另一个表bucket数(分桶数量是一致)
2) bucket列 == join列 == sort 列
3) 必须是应用在bucket map join的场景中
4)   开启相关的参数:
    -- 开启SMB map join
    set hive.auto.convert.sortmerge.join=true;
    set hive.auto.convert.sortmerge.join.noconditionaltask=true;
    --写入数据强制排序
    set hive.enforce.sorting=true;
    set hive.optimize.bucketmapjoin.sortedmerge = true; -- 开启自动尝试SMB连接

举报

相关推荐

0 条评论