hive SQL 静态分区和 动态分区

Hive 分区介绍:

hive中简单介绍分区表(partition table),含动态分区(dynamic partition)与静态分区(static partition)

hive中创建分区表没有什么复杂的分区类型(范围分区、列表分区、hash分区、混合分区等)。

分区列也不是表中的一个实际的字段,而是一个或者多个伪列。意思是说在表的数据文件中实际上并不保存分区列的信息与数据。

 

分区改变了HIVE 对数据存储的组织方式,hive 会创建反应分区结构的子目录,就是那些实际的目录名称。

对数据进行分区,最主要的原因就是为了更快的查询。

 

可以通过,show partitions 表名  查看表中存在的所有分区,

或者

describe extended  表名

desc 表名

 

 

动态分区:

当需要创建非常多的分区的时候,Hive提供了动态分区的功能:

可以基于查询的参数,推断出需要创建分区的名称。

 

INSERT OVERWRITE TABLE emp PARTITION (country, state)  SELECT ..., ... , se.cnty, se.st

FROM staged_emp se;

 

  

需要注意,字段值和分区之间的关系是根据位置而不是字段名称来进行匹配的。

动态分区也可以和静态分区混合使用,但是静态分区必须出现在动态分区之前。

 

举例:使用动态分区要先设置hive.exec.dynamic.partition参数值为true,默认值为false;

动态分区的使用方法很简单,假设我想向stat_date='20110728'这个分区下面插入数据,至于province插入到哪个子分区下面让数据库自己来判断,那可以这样写:

insert overwrite table partition_test partition(stat_date='20110728',province)

select member_id,name,province from partition_test_input where stat_date='20110728';

 

stat_date叫做静态分区列,province叫做动态分区列。

select子句中需要把动态分区列按照分区的顺序写出来,静态分区列不用写出来。这样stat_date='20110728'的所有数据,会根据province的不同分别插入到/user/hive/warehouse/partition_test/stat_date=20110728/下面的不同的子文件夹下,如果源数据对应的province子分区不存在,则会自动创建,非常方便,

而且避免了人工控制插入数据与分区的映射关系存在的潜在风险。

 

注意,动态分区不允许主分区采用动态列而副分区采用静态列,这样将导致所有的主分区都要创建副分区静态列所定义的分区:

 

insert overwrite table partition_test partition(stat_date,province='liaoning')

select member_id,name,province from partition_test_input where province='liaoning';

  

FAILED: SemanticException [Error 10094]: Line 1:49 Dynamic partition cannot be the parent of a static partition ''liaoning''

问题:一般是建表的时候,分区表的顺序出现了问题,静态分区一定要再动态分区的前面。 

 

动态分区可以允许所有的分区列都是动态分区列,但是要首先设置一个参数hive.exec.dynamic.partition.mode :
 
set hive.exec.dynamic.partition.mode;
hive.exec.dynamic.partition.mode=strict

  

 

posted @ 2019-04-16 10:39  静悟生慧  阅读(5484)  评论(0编辑  收藏  举报