Hive模式设计

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密集型任务。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值