1.分区表简介
当数据量很大时,一张表已经不适合装载全部数据(严重影响性能),同时很多场景的查询操作都是对部分数据的查询,这时我们需要对数据按一定规则进行分表。
RDBMS: 对数据进行分表,如一年的上网记录即为一张表
NOSQL:hive是设置分区的字段,对数据进行分区
扩展1:大数据的瓶颈之一是IO,IO分为disk、network两类,hive通过设置分区能大大降低disk的消耗,生产上几乎是分区表。
2.分区表创建以及使用
2.1语法
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: TEMPORARY available in Hive 0.14.0 and later)
[(col_name data_type [COMMENT col_comment], ... [constraint_specification])]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
PARTITIONED by:表示由那些字段来进行分区
动态分区:根据数据的某个或某几个字段的值将数据动态分到某个分区下
静态分区:将数据指定分配到某个分区下。
2.1创建静态分区表案列一
#将订单按月分进行分区
create table order_partition(
order_no string,
event_time string
)
PARTITIONED BY(event_month string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; #创建一张分区表1
load data local inpath '/home/hadoop/data/order.txt' overwrite into table order_partition
PARTITION (event_month='2014-05'); #将数据加载到指定分区2014-05
#若此时我们再复制一份数据到新建hdfs文件event_month='2014-06'目录下,直接查询是无法查询到新新分区的值的,mysql无此元信息,需执行添加分区语句。
ALTER TABLE order_partition ADD IF NOT EXISTS PARTITION (event_month='2014-06') ;
2.2 创建静态分区表案列二
#将员工信息按部分进行分区
show create table emp; # 展示某表的创建语句
CREATE TABLE `emp_static_partition`(
`empno` int,
`ename` string,
`job` string,
`mgr` int,
`hiredate` string,
`sal` double,
`comm` double)
partitioned by(deptno int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; #注意此时的部门编号不属于新表的列,是分区字段
insert into table emp_static_partition PARTITION (deptno=10)
select empno,ename,job,mgr,hiredate,sal,comm from emp
where deptno=10; # 查询的列顺序一定要和 静态表一致,不要用values那种
扩展2:若按照此方式来讲数据指定到某个分区,当分区字段值很多时,则会累死人了,故我们需要动态分区。
2.3创建动态分区表案列一
CREATE TABLE `emp_dynamic_partition`(
`empno` int,
`ename` string,
`job` string,
`mgr` int,
`hiredate` string,
`sal` double,
`comm` double)
partitioned by(deptno int)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; #语法和静态分区表一致
insert into table emp_dynamic_partition PARTITION (deptno)
select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp; #注意此时查询列要有deptno字段
此时会报错,告诉我们 要”To turn this off set hive.exec.dynamic.partition.mode=nonstrict” 去关闭严格模式。
set hive.exec.dynamic.partition.mode; #查询该配置的值
set hive.exec.dynamic.partition.mode=nonstrict; #设置为非严格模式
insert into table emp_dynamic_partition PARTITION (deptno)
select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp; #重新插数据
show partitions emp_dynamic_partition; #显示所有分区信息
扩展3:不管是静态还是动态分区,他们创建表的语法是一致的
扩展4:多层分区只要以逗号隔开添加相应的分区列即可
扩展5:可以采用load导入数据,也可以是insert,insert方式的分区字段要放在查询字段尾部且不是values方式插入。