在hive的數據建表時,為了查詢的高效性,我們經常會對表建立分區,例如下面的表
create external table dm_fan_photo_icf_basic(user string, item string, hot int) PARTITIONED BY (day string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' stored as textfile location '/user/hive/fan/photo/icf/basic/';
這是一個外部表,以(day)作為分區,在一般情況下,要插入新的數據必須要指定分區,例如
insert into table dm_fan_photo_icf_basic PARTITIONED BY (day = '20130620') select * from table_test where day = 20130620;
上面會把表table_test里面字段day = 20130620的數據插入到表dm_fan_photo_icf_basic中,並為這些新數據建立一個分區有時候要插入的數據可能不止一天,可能是一個月,這時候按照常規情況下就要寫多個sql,然后把分區字段名改成相應的日期,一方面代碼不簡潔,另一方面這需要啟動多個job,且沒有充分利用集群的優勢,如果能一次性把所有數據都插入不同分區,那么效率就提上來了,如果要把table_test表里面20130620至當天的數據插入表dm_fan_photo_icf_basic中,並且要對應到相應的分區,此時,可利用如下的方面
set hive.exec.dynamic.partition.mode=nonstrict; set hive.exec.dynamic.partition=true; insert into table dm_fan_photo_icf_basic PARTITIONED BY (day) select * from table_test where day >= 20130620 distribute by day;
其中前倆個設置是必須的,因為這是一種動態分區插入,在默認情況下是靜態的
最后面的distribute by day也是必須的,這是指定了分區