一,什么是分区表以及作用
数据分区的概念以及存在很久了,通常使用分区来水平分散压力,将数据从物理上移到和使用最频繁的用户更近的地方,以及实现其目的。
很久以前玩 DB2 的时候就接触到表分区和分区表的概念,在创建数据表的时候需要指定表分区字段以及该字段的值符合某个规则时将这些数据放置到特定的表分区上去。这样做的好处是可以将一个物理上的大表中的数据分布到不同的物理区域,从而减轻数据表访问的压力,提高数据访问的性能,但是在数据检索的时候,必须将分区字段作为检索条件传入进去,才能有效提高数据访问的性能。
hive 中也有分区表的概念,我们可以看到分区具重要性能优势,而且分区表还可以将数据以一种符合逻辑的方式进行组织。
严格意义上来说,hadoop 不是一种数据库,更准确的描述应该是将一批文件按照某种规则存放在 hdfs 文件系统中,并通过元数据来标识这些数据存放的具体路径。而 hive 不过是在此基础上提供了一个传统习惯上的 sql 数据的访问方式。
经常在网上看到 hive 的分层存储分区表分别有静态分区和动态分区的表述,着实迷茫了好一阵子。
为了搞懂这个问题,最后只能是参照了 cdh 官方文档的 hive 部分,结合网上的文章和具体的实践,自己摸索并加以总结,以备查。
二、针对 hive 分区表做的数据写入的实验
我们先来看看如下例子:
step 1: 在 hive 中创建一张分区表 , 分区字段为 wk_dt 。
hive>
create table test01 (
org_id string,
balance double(18,2)
) partitioned by(wk_dt string );
* 注意:我们在创建分区表的时候,并没有所谓的静态分区和动态分区的概念。
step 2: 在 hive 中创建另一张表,表名为 test02 , 字段与上述 test01 相同。
hive>
create table test02 (
org_id string,
balance double(18,2)
) partitioned by(wk_dt string );
step 3: 我们向 test02 中插入数据 。
insert overwrite table test02 partition (wk_dt='2020-11-05') values
{'1000001',20000.00},
{'1000001',20100.00},
{'1000002',25000.00},
{'1000002',28000.00};
insert overwrite table test02 partition (wk_dt='2020-11-06') values
{'1000001',1000.00},
{'1000001',18500.00},
{'1000002',23500.00},
{'1000002',28800.00};
以上插入数据命令执行完成后,我们产生了两个分区目录,分别是 wk_dt='2020-11-05' 和 wk_dt='2020-11-06' , 对应的 hdfs 系统上的分区目录路径如下:
/user/hive/warehouse/ods.db/test02/wk_dt=2020-11-05 和 /user/hive/warehouse/ods.db/test02/wk_dt=2020-11-06
下面我们开始做两个实验,将 test02 中的数据插入到 test01 中,看看两种不同方式产生的结果。
【方案一】以静态分区数据插入模式从 test02 表向 test01 表插入数据。
step 4: 从 test02 表中向 test01 表中插入数据。
insert overwrite table test01 partition (wk_dt='2020-11-06')
select org_id, balance from test02 ;
step 5:我们来检查 test01 的记录,看看结果 ;
select * from test01 ;
我们发现记录条数为 8 条,且 wk_dt 字段的内容我们全部用的是 2020-11-06
从上面的插入数据操作,我们可以发现,我们需要针对分区字段指定具体的数据值,才能将数据插入到 test01 表中,我们来看看刚刚我们插入数据后的 test01 的分区信息:
/user/hive/warehouse/ods.db/test01/wk_dt=2020-11-06
下面我们清除 test01 表数据,采用动态分区的方式插入数据,看看结果。
【方案二】以动态分区数据插入模式从 test02 表向 test01 表插入数据。
step 6:清除 test01 表数据
truncate table test01;
step 7: 开启动态分区操作模式
set hive.exec.dynamic.partition.mode=nonstrict //分区模式,默认nostrict
set hive.exec.dynamic.partition=true //开启动态分区,默认true
set hive.exec.max.dynamic.partitions=1000 //最大动态分区数,默认1000
step 8:再次通过 test02 向 test01 插入数据
insert overwrite table ods.test01 partition (wk_dt)
select org_id, balance, wk_dt
from test02 ;
step 9: 执行完成后,我们来看看这次 test01 表的分区目录情况,
/user/hive/warehouse/ods.db/test01/wk_dt=2020-11-05 和
/user/hive/warehouse/ods.db/test01/wk_dt=2020-11-06
========================================================================
总结:
1、hive 中没有什么静态分区表和动态分区表的概念,所谓的动态分区表和静态分区表是在具体的写入操作和读取操作中的一种模式。
2、在创建 hive 表的时候,是没有什么动态分区表和静态分区表的概念的。
3、在具体的数据写入的过程中,系统默认的是开启的静态分区数据写入模式,在这个模式下,需要指定分区字段的具体的值。
4、如果我们开启了动态分区数据写入模式,此时我们在写入的时候不需要也不能指定分区字段的值,系统会自动的根据数据中分区字段列的值动态创建分区目录。
附录:
阅读(2371) | 评论(0) | 转发(0) |