1. fetch属性
在旧版本的 Hive 中, hive-default.xml.template
文件中 hive.fetch.task.conversion
默认是 minimal
, 修改为 more
后, 全局查找、字段查找、limit查找等都会直接执行而不会运行 mapreduce.
新版本的 Hive Fetch 的默认值已改为 more
.
2. 本地模式
数据量小的情况下, 可以使用本地模式单机查询
通过设置 hive.exec.mode.local.auto
的值为 true
来实现
可直接在 Hive 的 CLI 中或 beeline 中设置
set hive.exec.mode.local.auto=true;
//设置最大输入数据量,小于这个值采用本地模式,默认为134217728(128M)
set hive.exec.mode.local.auto.inputbytes.max=536870912;
//设置最大输入文件个数,小于这个值时采用本地模式,默认为4
set hive.exec.mode.local.auto.input.files.max=30;
数据量小的情况下, 查询速度可提升数倍
3. 表优化
JOIN 语句, 小表, key 较分散的表放在左边, 大表放在右边
实际测试中, 新版的 Hive 优化器已对此做出处理, 无论放左边还是右边已无明显区别
-
空 key 过滤
hive (test)> insert overwrite table jointable select n.* from (select * from nidtable where id is not null) n left join bigt b on n.id = b.id;
-
空 key 转化
有时候虽然 key 为空, 但数据依然需要保留, 可以将空值转化为随即值, 这样就可以较为平均的分配到各个 reducer 中, 防止数据倾斜
hive (test)> set mapreduce.job.reduces = 5; hive (test)> insert overwrite table jointable select n.* from nidtable n full join bigt b on case when n.id is null then concat('hive', rand()) else n.id end = b.id;
-
Map 端 Join
默认
hive.auto.convert.join=true
, 符合条件自动开启 map 端 join
可自定义小表阈值set hive.mapjoin.smalltable.filesize=25000000
执行小表 join 大表语句
insert overwrite table jointable select b.id, b.time, b.uid, b.keyword, b.url_rank, b.click_num, b.click_u