Hive(12) Hive静态分区与动态分区

Hive静态分区

  • 表的分区字段的值需要开发人员手动给定

  • 创建分区表

use db1;
create table order_partition(
order_number string,
order_price  double,
order_time string
)
partitioned BY(month string)  --特别注意这里,partitioned by的参数是我们自己定义的
row format delimited fields terminated by '\t';
  • 准备数据
cd /kkb/install/hivedatas
vim order.txt 

10001	100	2019-03-02
10002	200	2019-03-02
10003	300	2019-03-02
10004	400	2019-03-03
10005	500	2019-03-03
10006	600	2019-03-03
10007	700	2019-03-04
10008	800	2019-03-04
10009	900	2019-03-04
  • 加载数据到分区表
load data local inpath '/kkb/install/hivedatas/order.txt' overwrite into table order_partition partition(month='2019-03');
  • 查询结果数据,可以看到,查询2019-3的数据,会将所有数据都查出来,不符合我们的需求
select * from order_partition where month='2019-03';
#结果为:
+-----+-------+--------------+----------+ 
10001   100.0   2019-03-02      2019-03
10002   200.0   2019-03-02      2019-03
10003   300.0   2019-03-02      2019-03
10004   400.0   2019-03-03      2019-03
10005   500.0   2019-03-03      2019-03
10006   600.0   2019-03-03      2019-03
10007   700.0   2019-03-04      2019-03
10008   800.0   2019-03-04      2019-03
10009   900.0   2019-03-04      2019-03
+-----+-------+--------------+----------+ 

Hive动态分区

动态分区:按照需求实现把数据自动导入到表的不同分区中,不需要手动指定

需求:根据分区字段不同的值,自动将数据导入到分区表不同的分区中

  • 创建表
--创建普通表/临时表
create table t_order(
    order_number string,
    order_price  double, 
    order_time   string
)row format delimited fields terminated by '\t';

--创建目标分区表
create table order_dynamic_partition(
    order_number string,
    order_price  double    
)partitioned BY(order_time string) --特别注意这里,partitioned by的参数是临时表中的某一个字段
row format delimited fields terminated by '\t';
  • 准备数据
cd /kkb/install/hivedatas
vim order_partition.txt

10001	100	2019-03-02 
10002	200	2019-03-02
10003	300	2019-03-02
10004	400	2019-03-03
10005	500	2019-03-03
10006	600	2019-03-03
10007	700	2019-03-04
10008	800	2019-03-04
10009	900	2019-03-04
  • 向普通表t_order加载数据
load data local inpath '/kkb/install/hivedatas/order_partition.txt' overwrite into table t_order;
  • 动态加载数据到分区表中
-- 要想进行动态分区,需要设置参数
-- 开启动态分区功能
set hive.exec.dynamic.partition=true; 
-- 设置hive为非严格模式
set hive.exec.dynamic.partition.mode=nonstrict; 
insert into table order_dynamic_partition partition(order_time) select order_number, order_price, order_time from t_order;
  • 查看分区
show partitions order_dynamic_partition;

1569313506031

总结,动态加载数据的步骤:

  1. 创建一个普通表/临时表
  2. 创建一个目标表,目标表根据普通表的某个字段来分区
  3. 将数据load到临时表中去
  4. 通过查询临时表将数据加载到目标表中去,特别注意:insert into table order_dynamic_partition partition(order_time) select order_number, order_price, order_time from t_order;
posted @ 2020-08-24 00:20  Whatever_It_Takes  阅读(125)  评论(0编辑  收藏  举报