hive动态分区使用(如非必须,不建议使用)

往hive分区表中插入数据时,如果需要创建的分区很多,比如以表中某个字段进行分区存储,则需要复制粘贴修改很多sql去执行,效率低。hive提供了一个动态分区功能,其可以基于查询参数的位置去推断分区的名称,从而建立分区。

一、单一分区字段动态分区表的创建与数据插入

1、建表

drop table if exists tmp.tmp_user_push_dynamic_partition;
CREATE TABLE tmp.tmp_user_push_dynamic_partition(
  userinfo_id bigint COMMENT '用户ID', 
  name string COMMENT '姓名', 
  idcode string COMMENT '身份证号', 
  birthday string COMMENT '生日', 
  sex int COMMENT '性别')
COMMENT '用户标签宽表'
PARTITIONED BY (
  age int)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
TBLPROPERTIES (
  'orc.compress'='snappy');

2、设置可以使用动态分区的参数

SET hive.exec.dynamic.partition=true; #开启动态分区,默认是false
SET hive.exec.dynamic.partition.mode=nonstrict; #开启允许所有分区都是动态的,否则必须要有静态分区才能使用

也可以设置最多分区等:

SET hive.exec.dynamic.partition=true;
SET hive.exec.max.dynamic.partitions=2048;
SET hive.exec.max.dynamic.partitions.pernode=256;
SET hive.exec.dynamic.partition.mode=nonstrict;

3、向动态分区表插入数据

insert overwrite table tmp.tmp_user_push_dynamic_partition partition(age)
select userinfo_id,name,idcode,birthday,sex,age
from dwf.dwf_user_push_personas_full_1d 
where idcode is not null
limit 10000;

要点:系统默认以最后一个字段【age】为分区名,因为分区表的分区字段默认也是该表中的字段,且依次排在表中字段的最后面。所以分区的字段只能放在后面,不能把顺序弄错。
如果我们查询了7个字段的话,则会报错,因为该表加上分区字段也才6个。系统是根据查询字段的位置推断分区名的,而不是字段名称。
使用,insert...select 往表中导入数据时,查询的字段个数必须和目标的字段个数相同,不能多,也不能少,否则会报错。

4、分区及数据查验

hive> show partitions tmp.tmp_user_push_dynamic_partition;
OK
age=-124
age=-128
age=-30
age=-32
age=-35
age=-38
age=-41
age=-45
age=-51
age=-53
age=-58
age=-62
age=-66
age=-76
age=-82
age=100
age=101
age=103
age=11
age=116
age=125
age=13
age=16
age=18
age=19
age=20
age=21
age=22
age=23
age=24
age=25
age=26
age=27
age=28
age=29
age=30
age=31
age=32
age=33
age=34
age=35
age=36
age=37
age=38
age=39
age=40
age=41
age=42
age=43
age=44
age=45
age=46
age=47
age=48
age=49
age=5
age=50
age=51
age=52
age=53
age=54
age=55
age=56
age=57
age=58
age=59
age=60
age=61
age=62
age=63
age=64
age=65
age=66
age=67
age=68
age=69
age=7
age=70
age=71
age=72
age=74
age=76
age=78
age=81
age=82
age=__HIVE_DEFAULT_PARTITION__
Time taken: 0.073 seconds, Fetched: 86 row(s)

hive> select * from tmp.tmp_user_push_dynamic_partition where age=20;
OK
245964  盖智伟  211303199910199999      1999-10-19      1       20
239910  林单    352224199908179999      1999-08-17      1       20
228741  马晓宇  370181199905249999      1999-05-24      0       20
225516  小懒猪  330211199906019999      1999-06-01      0       20
224127  马文    372901199910109999      1999-10-10      1       20
162135  曹越    310113199906159999      1999-06-15      1       20
102150  徐子骁  332527199912319999      1999-12-31      1       20
76200   赵庄羽  310104199911089999      1999-11-08      1       20
Time taken: 0.15 seconds, Fetched: 8 row(s)

二、多个分区字段半自动分区
多个分区字段时,实现半自动分区(部分字段静态分区,注意静态分区字段要在动态前面),单分区字段的动态分区都不建议使用,混合的就不做过多延伸了。

三、动态分区表的属性
使用动态分区表必须配置的参数 :

set hive.exec.dynamic.partition =true(默认false),表示开启动态分区功能
set hive.exec.dynamic.partition.mode = nonstrict(默认strict),表示允许所有分区都是动态的,否则必须有静态分区字段

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

你可能感兴趣的:(#,Hive)