需求:删除s_ls_yijj_syjglj_yhxx中所有分区中HD_FIND_DATE字段大于当前系统日期的数据删除
1.开启动态分区,并设置参数
#--开启动态分区,默认是false (可通过这个语句查看:set hive.exec.dynamic.partition;)
set hive.exec.dynamic.partition=true;
#--开启允许所有分区都是动态的,否则必须要有静态分区才能使用,默认是strict
set hive.exec.dynamic.partition.mode=nonstrict;
#--调整参数:(在这里遇到过坑,分区数太多,超出默认限制)
set hive.exec.max.dynamic.partitions.pernode=2000;
表示每个maper或reducer可以允许创建的最大动态分区个数,默认是100,超出则会报错,一般可以设置大一点,这里设置为2000
set hive.exec.max.dynamic.partitions =2000;
表示一个动态分区语句可以创建的最大动态分区个数,超出报错,默认是1000
set hive.exec.max.created.files =2000;
表示全局可以创建的最大文件个数,超出报错,默认是1000
2.创建一张与原表(s_ls_yijj_syjglj_yhxx)表结构一致的临时表(s_ls_yijj_syjglj_yhxx_tmp)
create table if not exists biaozhun.s_ls_yijj_syjglj_yhxx_tmp like biaozhun.s_ls_yijj_syjglj_yhxx;
3.向临时表(s_ls_yijj_syjglj_yhxx_tmp)中插入数据
INSERT INTO TABLE biaozhun.s_ls_yijj_syjglj_yhxx_tmp PARTITION (date_id)
SELECT
place_name,addres,dlname,xlname,hd_desc,level_name,hd_find_date,is_rectify_once,assign_rectify_date,rectify_desc,accept_date,accept_desc,hd_status,dj_status,dj_inserttime,dj_updatetime,dj_id,dj_flag,exchangetime,formatted_address,local_coord_x,local_coord_y,adcode,date_id
FROM biaozhun.s_ls_yijj_syjglj_yhxx
WHERE SUBSTR(REPLACE(REPLACE(REPLACE(HD_FIND_DATE, '-',''),' ',''),':',''),1,14) <= SUBSTR(REPLACE(REPLACE(REPLACE(from_unixtime(unix_timestamp(),"yyyy-MM-dd HH:mm:ss"), '-',''),' ',''),':',''),1,14);
注意:原表s_ls_yijj_syjglj_yhxx中的分区字段date_id必须放在最后一个字段的位置
这样就将date_id的值作为分区的值,分成多个分区存储,也就是在hdfs中分成了多个目录进行存储。
4.检查临时表(s_ls_yijj_syjglj_yhxx_tmp)与原表(s_ls_yijj_syjglj_yhxx)的数据量、分区、内容是否一样,如果一致,就可以用临时表替换原表了