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;
总结,动态加载数据的步骤:
- 创建一个普通表/临时表
- 创建一个目标表,目标表根据普通表的某个字段来分区
- 将数据load到临时表中去
- 通过查询临时表将数据加载到目标表中去,特别注意:insert into table order_dynamic_partition partition(order_time) select order_number, order_price, order_time from t_order;