hive SQL 静态分区和 动态分区

Hive 分区介绍:

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

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

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

 

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

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

 

能够经过,show partitions 表名  查看表中存在的全部分区,string

或者hash

describe extended  表名it

desc 表名io

 

 

动态分区:

当须要建立很是多的分区的时候,Hive提供了动态分区的功能:table

能够基于查询的参数,推断出须要建立分区的名称。

 

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
相关文章
相关标签/搜索