概述
Hive常见的几种模式:
1、按天划分的表
对于数据增长非常快的业务,就可以应用这种方式。
create table supply20210921(id int, part string);
--也可以用分区
create table supply(id int, part string) partitioned by (day int);
alter table supply add partition(day=20210921);
2、分区
使用分区可以优化一些查询,但是要注意数据倾斜、小文件太多等问题。理想的分区方案不应该产生太多的分区和文件夹目标,并且每个目录下的文件应该足够大(比如数据块的若干倍)。
一般分区策略:
- 按时间范围划分
- 使用两个级别的分区并使用不同的维度。如时间跟地区
create table weblogs(url string, time long) partitioned by (day int, state string)
select * from webblogs where day=20210921;
3、分桶表
如果没有找到合适的分区方式,可以考虑分桶表。比如先按时间分区,再按用户id作为分桶字段。一般相同用户id的记录会分到同一个桶。
create table weblog(user_id int, url string, source_ip string)
partitioned by (dt string) --指定时间分区
clustered by (user_id) into 96 buckets; --按user_ID进行分桶
set hive.enforce.bucketing=true;
/*
set mapred.reduce.tasks=96;
如果没有设置分桶属性,就需要设置跟分桶数量一致的reduce个数,然后再写入数据,并在select语句后使用cluster by语句。如果分桶跟排序的字段不同,可以用distribute by和sort by来替代cluster by。
*/
from raw_logs
insert overwrite table weblog
partition (dt='2021-09-21')
select user_id, url, source_ip where dt='2021-09-21';
select * from table_weblog tablesample(bucket 3 out of 96 on user_id) s
where dt='2021-09-21';
4、唯一键和标准化
Hive没有主键或基于序列秘钥生成的自增键的概念,对复杂的数据类型(如Array)也是非标准化的,虽然会导致数据重复、数据不一致的问题,但能最小化磁盘寻道。
5、同一份数据多种处理
如果同一份数据写入不同的表,可以用下面的语法,只需一次扫描即可
from history
insert overwrite sales select * where action='purchased'
insert overwrite credits select * where action='returned';
6、对每个表的分区
在ETL过程中使用分区,需要维护、管理中间表,还需要删除旧分区。
$ hive -hiveconf dt=2021-09-23
insert overwrite table distinct_ip_in_logs
partition (hit_date=${dt}) -- 指定分区
select distinct(ip) as ip from weblogs where hit_date='%{hiveconf:dt}';
create table state_city_for_day (state string, city string)
partitioned by (hit_date string); --创建分区中间表,不怕前一天数据被覆盖
insert overwrite table state_city_for_day partition (${hiveconf:dt}) --指定分区
select distinct(state, city) from distinct_ip_in_logs
join geodata on (distinct_ip_in_logs.ip=geodata.ip)
where (hit_date='${hiveconf:dt}');
7、增加新的列
如果数据文件有变化,可以通过alter table add column语句增加新的字段。但这种方法没办法在已有字段的开始或者中间增加新字段。
8、使用列式存储
常见的有两种情况:
-
列中有重复数据非常多
-
表有有非常多列,但经常查询的只是极少的一组字段
具体可以参看“RCFile”
9、使用压缩
几乎在所有情况下,压缩都能使磁盘上的存储的数据量变小,这样能降低I/O,提高查询效率,不过压缩和解压会消耗CPU资源。好在大部分MapReduce任务都是I/O密集型任务。
最后
以上就是清脆烧鹅为你收集整理的Hive模式设计的全部内容,希望文章能够帮你解决Hive模式设计所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复