Hive存在的问题:hive中没有索引机制,每次查询的时候,hive会暴力扫描整张表.MySQL具有索引机制.
因为没有分区,所以hive搞了一个分区表的机制.在建表的时候,加上分区字段,然后会在表的目录下建立一个个的分区.如果按照天为分区,那么在表目录里就会有每天的目录.分区表的核心就是分目录.
分区表的建表
create table dept_partition( deptno int, dname string, loc string ) partitioned by (day string) row format delimited fields terminated by '\t'; 上面的语法中分区字段不能和分区表中的内容一样
分区表的加载:加载数据的时候要把分区字段名给指定
load data local inpath '/opt/module/hive/datas/dept_20200401.log' into table dept_partition partition(day='20200401');分区表的查询
查询一个分区的方式:
select * from dept_partition where day = '20200401' 查询多个分区的方式一:
select * from dept_partition where day = '20200401' or day = '20200402'; 方式二:
select * from dept_partition where day = '20200401' union select * from dept_partition where day = '20200402' union select * from dept_partition where day = '20200403' union相当于纵向拼接,join是横向拼接
查看分区表下有多少个分区
show partitions dept_partition;删除分区表的分区
alter table dept_partition drop partition(day=' ');增加分区表的分区
alter table dept_partition add partition(day='20200404');增加多个(不能加逗号)
alter table dept_partition add partition(day='20200405') partition(day='20200406');删除多个分区(必须加逗号)
alter table dept_partition drop partition(day = '20200404'),partition (day = '20200405')二级分区的目的是为了解决每天的数据量也很大的情况
create table dept_partition2(deptno int,dname string,loc stirng) partitioned by (day string,hour string) row format delimited fields terminated by '\t';查询
select * from dept_partition2 where day= '20200401' and hour = '12'必须要进行的配置
(1)开启动态分区功能(默认true,开启)
hive.exec.dynamic.partition=true(2)设置为非严格模式(动态分区的模式,默认strict,表示必须指定至少一个分区为静态分区,nonstrict模式表示允许所有的分区字段都可以使用动态分区。)
hive.exec.dynamic.partition.mode=nonstrict下面的设置不是必须
(3)在所有执行MR的节点上,最大一共可以创建多少个动态分区。默认1000
hive.exec.max.dynamic.partitions=1000(4)在每个执行MR的节点上,最大可以创建多少个动态分区。该参数需要根据实际的数据来设定。比如:源数据中包含了一年的数据,即day字段有365个值,那么该参数就需要设置成大于365,如果使用默认值100,则会报错。
hive.exec.max.dynamic.partitions.pernode=100(5)整个MR Job中,最大可以创建多少个HDFS文件。默认100000
hive.exec.max.created.files=100000(6)当有空分区生成时,是否抛出异常。一般不需要设置。默认false
hive.error.on.empty.partition=false创建分桶表
create table stu_buck(id int, name string) clustered by(id) into 4 buckets row format delimited fields terminated by '\t';怎么查看一张表是分区表还是分桶表?(详细查看表信息)
desc formatted stu_buck;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5XrFMKvq-1601696317519)(E:\BigData\学习笔记\Typora\hive\src\分桶字段.png)]
往分桶表中插入数据(执行分桶表插入数据的时候,有可能会报错.(hive新版本跑的是mr,因此要改用hdfs路径导入数据)
load data local inpath ‘/opt/module/hive/datas/tmp/student.txt' into table stu_buck;下面是正确的排序的方式:
load data inpath ‘hdfs路径' into table stu_buck;e新版本跑的是mr,因此要改用hdfs路径导入数据)
load data local inpath ‘/opt/module/hive/datas/tmp/student.txt' into table stu_buck;下面是正确的排序的方式:
load data inpath ‘hdfs路径' into table stu_buck;