我是靠谱客的博主 清脆烧鹅,最近开发中收集的这篇文章主要介绍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密集型任务。

最后

以上就是清脆烧鹅为你收集整理的Hive模式设计的全部内容,希望文章能够帮你解决Hive模式设计所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部