博客 Hive的表操作8

Hive的表操作8

   数栈君   发表于 2023-07-07 11:11  194  0

一、Hive的优化
1.key值问题-空KEY过滤
有时join超时是因为某些key对应的数据太多,而相同key对应的数据都会发送到相同的reducer上,从而导致内存不够。此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在SQL语句中进行过滤。例如key对应的字段为空,操作如下:
环境准备:

-- 普通查询
select * from 表A a left join 表B b on a.id = b.id where 过滤a表和b表的最新数据

-- 高效率查询-谓词下推
select * from 表A a where 过滤a表的最新数据
select * from 表B b where 过滤b表的最新数据

select * from (select * from 表A a where 过滤a表的最新数据) a left join (select * from 表B b where 过滤b表的最新数据) b on a.id = b.id
1
2
3
4
5
6
7
8
2.空key转换
有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在join的结果中,此时我们可以表a中key为空的字段赋一个随机的值,使得数据随机均匀地分不到不同的reducer上。例如:

-- 不随机分布:
set hive.exec.reducers.bytes.per.reducer=32123456;
set mapreduce.job.reduces=7;
INSERT OVERWRITE TABLE jointable
SELECT a.*
FROM nullidtable a
LEFT JOIN ori b ON CASE WHEN a.id IS NULL THEN 'hive' ELSE a.id END = b.id;

No rows affected (41.668 seconds) 52.477
1
2
3
4
5
6
7
8
9
结果:这样的后果就是所有为null值的id全部都变成了相同的字符串,及其容易造成数据的倾斜(所有的key相同,相同key的数据会到同一个reduce当中去)

为了解决这种情况,我们可以通过hive的rand函数,随记的给每一个为空的id赋上一个随机值,这样就不会造成数据倾斜

-- 随机分布:
set hive.exec.reducers.bytes.per.reducer=32123456;
set mapreduce.job.reduces=7;
INSERT OVERWRITE TABLE jointable
SELECT a.*
FROM nullidtable a
LEFT JOIN ori b ON CASE WHEN a.id IS NULL THEN concat('hive', rand()) ELSE a.id END = b.id;


No rows affected (42.594 seconds)
1
2
3
4
5
6
7
8
9
10
3.Hive的去重问题
-- 准备数据
1 2022-01-01 zhangsan 80
1 2022-01-01 zhangsan 80
1 2022-01-01 zhangsan 80

2 2022-01-01 lisi 70
2 2022-01-01 lisi 70
2 2022-01-01 lisi 70
------------去重--------------

1 2022-01-01 zhangsan 80
2 2022-01-01 lisi 70
1
2
3
4
5
6
7
8
9
10
11
12

方法1:distinct
select distinct * from 表
注意,在Hive中distinct必须只有一个reduce才能完成整体的去重,效率极低,千万不要用
1
2
3


方法2:group by
select sid,sname,sbirth,ssex from student2 group by sid,sname,sbirth,ssex;
1
2
方法3:row_number() over()
with t as (
select
*,
row_number() over (partition by sid ) rk
from student2
)
select * from t where rk = 1;

注意,生产环境就用该方式进行去重,这里不能使用rank和dense_rank()
1
2
3
4
5
6
7
8
9
10
总结
今天继续和大家分享一下Hive的表操作8,一些简单基础的Hive优化操作,后续其他的优化方法会通过实战案例,继续分享


免责申明:

本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

《数据治理行业实践白皮书》下载地址:https://fs80.cn/4w2atu

《数栈V6.0产品白皮书》下载地址:
https://fs80.cn/cw0iw1

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:
https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:
https://github.com/DTStack

0条评论
上一篇:HBase基础
下一篇:
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群