分区
- 分区的类型
动态分区,静态分区
###hive静态分区
静态分区下单分区
静态分区单分区(如果没有数据在web页面是不显示的)
向里面发送数据
发送数据之后 在查看
传输数据
在web页面下显示的是hh文件夹。以文件夹区分
删除分区
alter table tablename drop partition01 (hh=“hh01”)必须要有aaa这个分区才能删除
静态分区下双分区
向里面传输数据,因为是双分区
还是没有数据
如果我单独向其中一个分区传输数据会报错
如果我单独向两个分区传输数据
为什么单独向一个分区传输数据会出错?
因为你创建表的时候指定的就是双分区,所以只能向子分区里传输文件
相当于把分区的信息加到了表里面,相当于两个字段,
第一个字段里能放的就是第二个分区的信息,只能放第二个分区的信息。
第二个分区放的是数据的信息。
添加分区
添加分区:alter table partition02 add partition (hh=“123”,heihei=123);
正确的添加双分区,必须双分区要同时创建,或者在之前的分区上,创建子分区。
错误的添加分区
有添加分区就肯定有删除分区
alter table partition02 drop partition (hh=“123”,heihei=456)
如果子分区被删完主分区也不会留下,
可以只删除一个子分区,也可以直接删除主分区,如果主分区被删,下面的子分区会被全部删除,
动态分区
动态分区其实就是不用你自己去分区,而是自动分区。
动态分区和静态分区的区别就在于需要修改权限并且需要修改状态
修改的状态和权限都是暂时的,如果你退出hive之后,这些都会回归原来的状态,
1.修改权限
set hive.exec.dynamic.partition;
如果为true就不用修改,如果不是true就需要修改。
set hive.exec.dynamic.partition=true;
2.修改默认状态
默认状态是strict创建动态分区的话需要修改为nostrict
set hive.exec.dynamic.partition.mode=nostrict;
创建第一个动态分区表
复制第一个动态分区表的格式
复制的表的格式和第一个表的格式一样
create table student1 like student;
like:只复制表的结构,不复制表的数据。
第一个分区表是从本地向里面传输数据
load data local inpath ‘/root/bb.txt’ into table traffic.student partition (hh=“hhh”);
//不能是表里的数据,与上边对应
第二个分区表是是从第一个数据表里向第二个数据表里面传输数据。
动态分区表其实就是不需要自己制定分区,因为我没有与之匹配的数据,所以我才会创建一个相同的数据表来给动态分区表赋值
动态分区追加数据
from student insert into table student1 partition (hh) select * ; //如果表里有数据会追加
动态分区覆盖数据
我用了两种不同的方式添加数据,喜欢那种可以用哪一种
insert overwrite table student1 partition(hh) select * from student;//如果表里有数据会替换
根据上个表的分区自动分区。
如果你有数据并且存在了hive中,而且表的格式和动态分区表的格式一样,就可以把数据发送到动态分区表。
分桶
创建分桶的时候需要先开启分桶
set hive.enforce.bucketing=true
创建分桶表
clustered(聚集索引)
clustered by (字段名)//表里的数据 into 4 buckets //创建四个桶
向桶内发送数据
首先,我们要有和分桶一样结构的表(这个表不是分桶表),里面还要有与之对应的数据,才可以向分桶发送数据。
insert into table bucket select * from bucket01;
我们可以看出hive的底层是hdfs和MapReduce。
最后的数据会由MapReduce处理发送到hdfs上存储。
并且在hdfs上创建分桶。
抽样分桶
select * from bucket tablesample(bucket 2 out of 4 by id);
抽样出分桶里的数据
前面的1是从第几个分桶开始。
后面的4是总分桶的倍数或者因子。
提示: 前面的数字不要比后面的大
(小弟初识大数据,有错误的,希望各位大牛指正,谢谢各位!!!!)