文章目录
HiveSQL优化
join关联表采用on进行数据的过滤
通过limit分批写入数据
insert into table tb1
select * from tb2 limit 100
1 分桶采样
- 当表的数据量比较庞大的时候, 在编写SQL语句后, 需要首先测试 SQL是否可以正常的执行, 需要在表中执
行查询操作, 由于表数据量比较庞大, 在测试一条SQL的时候整个运行的时间比较久, 为了提升测试效率, 可以整个表
抽样出一部分的数据, 进行测试
-
校验数据的可行性(质量校验) 100条 sum() join
-
进行统计分析的时候, 并不需要统计出具体的指标, 可能统计的都是一些相对性指标, 比如说一些比率(合
格率)问题, 此时可以通过采样处理 10 /100 1/10
select * from 表 tablesample ( bucket x out of y [on column|rand()])
select * from ods.ods_mem_member_union_i tablesample ( bucket 3 out of 3 on sex);
select sex,
count(member_id) over(partition by sex),
count(member_id) over(),
count(member_id) over(partition by sex) / count(member_id) over()
from ods.ods_mem_member_union_i tablesample ( bucket 3 out of 3 on rand());
2 Join优化
在表关联时,因为关联字段的原因造成某个reduce处理的数据量过大,产生数据倾斜,导致计算时间过长
项目中主要发生DWD层中,
门店销售明细表
dwd_sale_store_sale_dtl_i
线下销售数据
商城核销明细表
dwd_sold_shop_order_dtl_i
线上的销售数据
将支付金额和退款金额合并在一起
方案一 MapJoin
Map Join: 每一个mapTask在读取数据的时候, 每读取一条数据, 就会和内存中班级表数据进行匹配, 如果能匹配的上
, 将匹配上数据合并在一起, 输出即可
好处:
将原有reduce join 问题全部都可以解决
弊端:
1- 比较消耗内存
2- 要求整个 Join 中, 必须的都有一个小表, 否则无法放入到内存中
仅适用于: 小表 join 大表 | 大表 join 小表
设置
set hive.auto.convert.join=true; – 开启 map join的支持 默认值为True
set hive.auto.convert.join.noconditionaltask.size=20971520; – 设置 小表数据量的最大阈值: 默认值
为 20971520(20M)
方案二 Bucket Map Join
大表join大表
通过分桶的方式将大表文件拆分小文件
1-开启Bucket Map Join支持: set hive.optimize.bucketmapjoin =true;
2-Join两个表必须是分桶表
3-一个表的分桶数量是另一个表的分桶数量的整倍数
4-分桶列必须是join的ON条件的列
5-必须建立在Map Join场景中
create table tb_cls(
cid