分区表
- 分区表实际上就是对应一个HDFS文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件
- Hive中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集
- 在查询时通过WHERE子句中的表达式选择查询所需要的指定的分区,这样的查询效率
会提高很多
分区表基本操作
引入分区表
dept_20200401.log
dept_20200402.log
dept_20200403.log
创建分区表
hive (default)> create table dept_partition(
deptno int, dname string, loc string
)
partitioned by (day string)
row format delimited fields terminated by '\t';
- 分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列
加载数据到分区表中
- 数据准备
dept_20200401.log
10 ACCOUNTING 1700
20 RESEARCH 1800
dept_20200402.log
30 SALES 1900
40 OPERATIONS 1700
dept_20200403.log
50 TEST 2000
60 DEV 1900
- 加载数据
hive (default)> load data local inpath
'/opt/module/hive/datas/dept_20200401.log' into table dept_partition
partition(day='20200401');
hive (default)> load data local inpath
'/opt/module/hive/datas/dept_20200402.log' into table dept_partition
partition(day='20200402');
hive (default)> load data local inpath
'/opt/module/hive/datas/dept_20200403.log' into table dept_partition
partition(day='20200403');
分区表加载数据时,必须指定分区
查询分区表中数据
- 单分区查询
hive (default)> select * from dept_partition where day='20200401';
- 多分区联合查询
hive (default)> select * from dept_partition where day='20200401'
union
select * from dept_partition where day='20200402'
union
select * from dept_partition where day='20200403';
hive (default)> select * from dept_partition where day='20200401' or day='20200402' or day='20200403';
增加分区
- 创建单个分区
hive (default)> alter table dept_partition add partition(day='20200404');
- 同时创建多个分区
hive (default)> alter table dept_partition add partition(day='20200405') partition(day='20200406');
删除分区
- 删除单个分区
hive (default)> alter table dept_partition drop partition(day='20200406');
- 同时删除多个分区
hive (default)> alter table dept_partition drop partition(day='20200404'), partition(day='20200405');
查看分区表有多少分区
hive> show partitions dept_partition;
查看分区表结构
hive> desc formatted dept_partition;
二级分区
如果一天的日志数据量也很大,如何再将数据拆分?
创建二级分区表
hive (default)> create table dept_partition2(
deptno int, dname string, loc string
)
partitioned by (day string, hour string)
row format delimited fields terminated by '\t';
正常的加载数据
- 加载数据到二级分区表中
hive (default)> load data local inpath
'/opt/module/hive/datas/dept_20200401.log' into table dept_partition2 partition(day='20200401', hour='12');
- 查询分区数据
hive (default)> select * from dept_partition2 where day='20200401' and hour='12';
分桶表
- 对于一张表或者分区,Hive可以进一步组织成桶,也就是更为细粒度的数据范围
划分 - 分桶是将数据集分解成更容易管理的若干部分的另一个技术
- 分区针对的是数据的存储路径;分桶针对的是数据文件
创建分桶表
- 数据准备
1001 ss1
1002 ss2
1003 ss3
1004 ss4
1005 ss5
1006 ss6
1007 ss7
1008 ss8
1009 ss9
1010 ss10
1011 ss11
1012 ss12
1013 ss13
1014 ss14
1015 ss15
1016 ss16
- 创建分桶表
create table stu_buck(id int, name string)
clustered by(id)
into 4 buckets
row format delimited fields terminated by '\t';
- 查看表结构
hive (default)> desc formatted stu_buck;
Num Buckets: 4
- 导入数据到分桶表中,load的方式
hive (default)> load data inpath '/student.txt' into table stu_buck;
- 查询分桶的数据
hive(default)> select * from stu_buck;
- 分桶规则:Hive的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中
分桶表操作需要注意的事项
- reduce的个数设置为-1,让Job自行决定需要用多少个reduce 或者将reduce的个
数设置为大于等于分桶表的桶数 - 从hdfs中load数据到分桶表中,避免本地文件找不到问题
- 不要使用本地模式