数据库分区的主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间,主要包括两种分区形式:水平分区与垂直分区。水平分区是对表进行行分区。而垂直分区是对列进行分区,一般是通过对表的垂直划分来减少目标表的宽度,常用的是水平分区.

1. hive建立分区表

create external table if not exists tablename(
a string,
b string)
partitioned by (year string,month string)
row format delimited fields terminated by ','
stored as orc

2. 向分区表插入数据

2.1. 静态插入数据

要求插入数据时指定与建表时相同的分区字段

INSERT OVERWRITE TABLE tablename partition(year='2017', month='03')
SELECT a, b
FROM tablename2

2.2 动静混合分区插入

要求指定部分分区字段的值

INSERT OVERWRITE TABLE tablename partition(year='2017', month)
SELECT a, b
FROM tablename2;

2.3. 动态分区插入

只指定分区字段,不用指定值

INSERT OVERWRITE TABLE tablename partition(year, month)
SELECT a, b
FROM tablename2;

3. hive动态分区相关参数设置

使用动态分区表必须配置的参数:

--(默认false),表示开启动态分区功能
set hive.exec.dynamic.partition =true;
 
--(默认strict),表示允许所有分区都是动态的,strict/nonstrict,strict 要求至少包含一个静态分区列,nonstrict则无此要求
set hive.exec.dynamic.partition.mode = nonstrict; 

动态分区相关的调优参数:

--(默认100,一般可以设置大一点,比如1000).表示每个maper或reducer可以允许创建的最大动态分区个数,默认是100,超出则会报错。
set hive.exec.max.dynamic.partitions.pernode=100 
 --默认1000,表示一个动态分区语句可以创建的最大动态分区个数,超出报错
set hive.exec.max.dynamic.partitions =1000
--默认10000,全局可以创建的最大文件个数,超出报错。
set hive.exec.max.created.files =10000 

4. hive导入方式

hive包括以下四种数据导入方式:

  • 从本地文件系统中导入数据到Hive表;
  • 从HDFS上导入数据到Hive表;
  • 在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中;
  • 从别的表中查询出相应的数据并导入到Hive表中。

INSERT INTO 与 INSERT OVERWRITE 都可以向hive表中插入数据,但是INSERT INTO直接追加到表中数据的尾部,而INSERT OVERWRITE会重写数据,即先进行删除,再写入。如果存在分区的情况,INSERT OVERWRITE会只重写当前分区数据。