hive分区

1.分区(partitions)

   分区器 partitioner

 hive = hdfs + mysql中的模板 我们分区是将hdfs中的数据分为多份

2.静态分区   例子,单个分区字段

 创建一个temb表,分区字段 month 列与列用空格隔开

   create table tem(id int,tem double) partitioned by (month int) row format delimited fields terminated by " ";

 创建成功
 

 查看表结构   desc tem;

 

 编写tem.txt文件 vim /tem.txt

 

 注意:分区表中的数据分区的列也是表中的一个列,但是这个列不能直接操作,比如在加载数据的时候不能直接将数据加载到表中的这个字段上
    我们需要手动指定,因为我们指定的这个字段将会保存在hdfs中的一个文件夹上

 将本地数据tem.txt上传到tem表里   load data local inpath '/tem.txt' into table tem partition(month=5);

 上传成功

 

 

 从表里查看数据   select * from tem;
 

 从web页面查看

 

 

 查看tem表的分区   show partitions tem;

 

 再一次上传文件到tem表

 

 查看tem表

 

 可以通过分区号来查询   select * from tem where month=6;
 

 注意:查询数据的时候把分区字段作为一个基础字段进行使用就可以了

3.静态分区   例子,多层分区

 创建一个tem1表,分区字段month、day,分隔符空格

 create table tem1(id int,tem double) partitioned by(month int,day int) row format delimited fields terminated by " ";

 

 编写tem.txt文件   vim /tem.txt

 

 上传文件到tem1表

 load data local inpath '/tem.txt' into table tem1 partition(month=5,day=9);
 load data local inpath '/tem.txt' into table tem1 partition(month=5,day=10);
 load data local inpath '/tem.txt' into table tem1 partition(month=6,day=9);
 load data local inpath '/tem.txt' into table tem1 partition(month=6,day=10);

 现在有四个分区,从web页面查看

 

  

 

 

 查看tem1的分区   show partitions tem1;

 展示的分区数据在mysql中    好处:可以很大增加查询效率,因为直接指向的就是哪个小文件夹的路径
 

4.动态分区

 实际上分区数量越多越精确查询效率越高,不能越多越好?因为如果分区数量特别大那么会使得元数据压力太大,所以我们会取中间值

 分区不需要我们手动指定,我们只需要将数据插入到表中,那么hive会根据字段的值进行自动的分区

 例子,动态分区

 创建tem2表

 create table tem2(id int,tem double) partition by(month int,day int) row format delimited fields terminated by " ";

 

 编写tem2.txt文件

 

 把文件上传到tem2表  load data local inpath '/tem2.txt' into table tem2 partition(month,day);

 

 设置   set hive.exec.dynamic.partition.mode=nonstrict;
 

 

 注意:因为是动态分区所以我们不会指定分区字段,会根据字段的值自己识别,load数据的时候hive表没有办法识别谁是分区字段
    insert数据到这个分区表中,这个表就会知道谁是分区字段insert into table values(1,2,3,4)

    load数据到一个临时表中 然后再从临时表中查询数据  再将数据插入到这个d_p的表中

 创建临时表   create table tem2_e(id int,tem double,month int,day int) row format delimited fields terminated by " ";

 

 把tem2.txt文件上传到临时表tem2_e   load data local inpath '/tem2.txt' into table tem2_e;

 

 将tem2_e表里的数据插入tem2表   insert into tem2 partition(month,day) select * from tem2_e;
 

 从web页面查看

 

 注意:是按照位置进行动态分区,而不是字段名

5.混合分区

 



 

 

 

 



 

 

 



 

 

 

 

 

 


 



 

 

 

 

 



 

 

 

 

 

 

 



 

 

 

 

 

 

 

 

 

 

posted @ 2019-05-12 16:23  zhangqi00  阅读(365)  评论(0编辑  收藏  举报