建站教程

建站教程

Products

当前位置:首页 > 建站教程 >

大数据之-HIVE入门(十四)

GG网络技术分享 2025-03-18 16:09 0


查询优化

  • map端优化

当join时有一个或多个小表可以装载进内存时可以使用mapjoin完成。

第一种方法是可以加上mapjoin指示

第二种方法是设置 set hive.auto.convert.join=true;来让hive自动优化。同时可以指定

sethive.auto.convert.join.noconditionaltask = true; --默认开启

sethive.auto.convert.join.noconditionaltask.size = 10000000; --默认10M,可以根据需求做调整。

hive.mapjoin.smalltable.filesize=2500000;--早期hive版本小表文件大小设置默认25M。

select/*  MAPJOIN(time_dim) */count(*)fromstore_salesjointime_dimon(ss_sold_time_sk = t_time_sk);---select/*  MAPJOIN(time_dim, date_dim) */count(*)fromstore_salesjointime_dimon(ss_sold_time_sk = t_time_sk)joindate_dimon(ss_sold_date_sk = d_date_sk)wheret_hour =8andd_year =2002---sethive.auto.convert.join=true;sethive.auto.convert.join.noconditionaltask =true;sethive.auto.convert.join.noconditionaltask.size =10000000;selectcount(*)fromstore_salesjointime_dimon(ss_sold_time_sk = t_time_sk)

当数据量比较大启动mapjoin后会造成问题请关闭

  • group by 优化

set hive.map.aggr = true; //是否在 Map 端进行聚合,默认为 True ;

sethive.groupby.mapaggr.checkinterval = 100000000; //在 Map 端进行聚合操作的条目数目

  • 数据查询主要原则:

1、在关联操作前尽量减小数据集,能先聚合的先聚合、能过滤的先过滤(如设置查询条件、合理设置分区,有分区必须设置分区范围)。

2、关联时数据类型要做到一致,如果不一致请用cast先转换类型。

3、慎用count(distinct) ,容易产生数据倾斜,可以先group by 再count。

4、减少小文件,合理设置输入文件大小、合理设置map job 、reduce job数。

set hive.merge.mapredfiles=true;--设置合并map文件标识。

set mapred.max.split.size=100000000; --设置最大输入文件大小,大于此数值都会进行拆分。

setmapred.min.split.size.per.node=100000000;--设置每个节点可处理的最小值。

setmapred.min.split.size.per.rack=100000000;--设置每个机架可处理的最小值。

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; – 执行前进行小文件合并。

set mapred.reduce.tasks=10; -- 设置reduce的数量

sethive.exec.reducers.bytes.per.reducer=1073741824 --设置每个reduce所处理的数据大小

5、选取字段避免用select * ,只引用你要用的字段,如select a.uid,a.price。

6、关联值有null值的情况下,可以将null值过滤出来单独处理或者将null值随机赋值。当存在某key有热点问题,也可以同样处理。

7、合理设置数据模型、文件存储格式有利于查询效率优化。

8、善用union all 合并对于同一个表的查询,有利于整体提高效率。

9、合理使用中间临时表,数据量巨大时,如统计一年的数据,可先小规模聚合如按月聚合生成中间表,最后再合并统计出结果。

10、有order by 要限制输出条数。

11、合理设置并行查询

set hive.exec.parallel=true; --以开启并发执行。

sethive.exec.parallel.thread.number=10;//同一个sql允许最大并行度,默认为8。

标签:

提交需求或反馈

Demand feedback