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''
问题:通常是建表的时候,分区表的顺序出现了问题,静态分区必定要再动态分区的前面。
set hive.exec.dynamic.partition.mode; hive.exec.dynamic.partition.mode=strict