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方式插入。