大数据之hive:hive分区表

Posted 浊酒南街

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据之hive:hive分区表相关的知识,希望对你有一定的参考价值。

一、分区表以及作用

分区表是将数据以一种符合逻辑的方式进行组织,以对表进行合理的管理以及提高查询效率。
一个分区实际上就是表下的一个目录,一个表可以在多个维度上进行分区,分区之间的关系就是目录树的关系。
分区表根据不同的分类方式有静态分区和动态分区,还有单分区和多分区,时间场景常见的有时间分区和业务分区;

创建分区,需要在create表的时候调用可选参数partitioned by;

二、静态分区

1、创建静态分区:

create table t1(
    id      int
   ,name    string
   ,hobby   array<string>
   ,address     map<String,string>
)
partitioned by (day string)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
;

注:这里分区字段不能和表中的字段重复。如果分区字段和表中字段相同的话,会报错。

2、加载数据

load data local inpath '/home/hadoop/Desktop/data' overwrite into table t1 partition ( day = '2017-01-01');

insert into table  t1  partition (day = '2017-01-01') values (1   xiaoming    ["book","TV","code"]    {"beijing":"chaoyang","shagnhai":"pudong"})

 INSERT OVERWRITE TABLE emp_partition PARTITION (deptno=10) select * from emp where deptno=10;
 emp_partition 7个字段(不包含分区deptno)emp表也应该有7个对应字段;
hive (wzj)> 

3、查看数据及分区

select * from t1;
1   xiaoming    ["book","TV","code"]    {"beijing":"chaoyang","shagnhai":"pudong"}  2017-01-01
2   lilei   ["book","code"] {"nanjing":"jiangning","taiwan":"taibei"}   2017-01-01
3   lihua   ["music","book"]    {"heilongjiang":"haerbin"}  2017-01-01

查看分区:

show partitions t1;

4、增加分区

alter table t1 add partition (day = '2017-01-02');
alter table t1 add if not exists partition(day ='2017-01-03')
alter table t1 add partition(day = '2017-01-04') partition(day = '2017-01-05'); 

5、查询某一分区的数据

select * from t1 where day= '2017-01-02';

静态双分区类似,只不过分区的顺序决定了谁是父目录,谁是子目录,如partitioned by (year string,month string)

insert overwrite table part_test_3 partition(month_id='201805',day_id='20180509') select * from part_test_temp;

三、动态分区

为什么要使用动态分区呢,我们举个例子,假如中国有50个省,每个省有50个市,每个市都有100个区,那我们都要使用静态分区要使用多久才能搞完。所有我们要使用动态分区。
动态分区默认是没有开启。开启后默认是以严格模式执行的,在这种模式下需要至少一个分区字段是静态的。

关闭严格分区模式
动态分区模式时是严格模式,也就是至少有一个静态分区。
set hive.exec.dynamic.partition.mode=nonstrict	//分区模式,默认nostrict
set hive.exec.dynamic.partition=true			//开启动态分区,默认true
set hive.exec.max.dynamic.partitions=1000		//最大动态分区数,默认1000

1、创建一个普通动态分区表一:

create table if not exists  zxz_5(
 name string,
 nid int,
 phone string,
 ntime date
 ) 
 partitioned by (year int,month int) 
 row format delimited 
 fields terminated by "|"
 lines terminated by "\\n"
 stored as textfile;

2、创建一个普通动态分区表二:

create table orders_part(
order_id string,
user_id string,
eval_set string,
order_number string,
order_hour_of_day string,
days_since_prior_order string
)partitioned by(order_dow string)
row format delimited fields terminated by ',';
 
--添加数据
insert into table orders_part partition (order_dow) select order_id,user_id,eval_set,order_number,order_hour_of_day,days_since_prior_order,order_dow from orders;
其中orders表中的字段是:
order_id,user_id,eval_set,order_number,order_dow,order_hour_of_day,days_since_prior_order

3、加载数据:

加载数据

insert overwrite table  zxz_5 partition (year,month) select name,nid,phone,ntime,year(ntime) as year ,month(ntime) as month from zxz_dy; 
zxz_5这个表里面存放着数据。
我们利用year,和month函数来获取ntime列的年和月来作为分区,这个是靠我们查询到的数据来分区的

加载数据

# month_id和 day_id均为动态分区:
insert overwrite table dynamic_test partition(month_id,day_id)  
select c1,c2,c3,c4,c5,c6,c7,substr(day_id,1,6) as month_id,day_id from kafka_offset;

加载数据

#month_id为静态分区,day_id为动态分区:
insert overwrite table dynamic_test partition(month_id='201710',day_id)  
select c1,c2,c3,c4,c5,c6,c7,day_id from kafka_offset
where substr(day_id,1,6)='201710';

为了让分区列的值相同的数据尽量在同一个mapreduce中,这样每一个mapreduce可以尽量少的产生新的文件夹,可以借助distribute by的功能,将分区列值相同的数据放到一起。

insert overwrite table dynamic_test partition(month_id,day_id)
select c1,c2,c3,c4,c5,c6,c7,substr(day_id,1,6) as month_id,day_id from kafka_offset
distribute by month_id,day_id;

以上是关于大数据之hive:hive分区表的主要内容,如果未能解决你的问题,请参考以下文章

大数据之hive:hive分桶表

打怪升级之小白的大数据之旅(六十六)<Hive旅程第七站:Hive的分区表与分桶表>

打怪升级之小白的大数据之旅(六十六)<Hive旅程第七站:Hive的分区表与分桶表>

打怪升级之小白的大数据之旅(六十七)<Hive旅程第八站:Hive的函数>

打怪升级之小白的大数据之旅(六十七)<Hive旅程第八站:Hive的函数>

大数据技术之Hive查询分区表和分桶表