场景:业务库中的流水数据采集到hive中,以update所在的天为静态分区字段,每天增量采集T+1的离线数据入Hive。
跑批几天发现业务数据有追加历史数据的情况,T+1离线跑批不能把业务系统追加的数据再采集进来。追加数据出现丢失的情况。
解决办法:
修改静态分区表为动态分区,每天调度跑批(按照update所在的天)前7天的数据,动态插入到Hive表不同的分区中。(sqoop不能直接把数据插入动态分区表,所需要先保存到临时表中,再插入动态分区表。)
1.查询当前日期前7天內update的数据,保存到ods_tb_name_tmp表 ,注意:分区字段也要写到query语句中。
- /usr/bin/sqoop import
–connect “jdbc:mysql://$ source_ip:$ source_port/$ source_database”
–username $ source_username
– password $ source_pwd
–query "select trans_idx,trans_tp, up_dtime,down_dtime,card_no,card_tp,company_id,company_nm,line_id,line_nm,bus_num,up_station_nm,down_station_nm,trans_ts,settle_dt,trans_at,chn_proc_st,rec_crt_ts
,DATE_FORMAT(up_dtime_new,‘%Y-%m-%d’) dt from tb_name where
up_dtime>=date_add(‘$ do_day’, interval -7 day) and $CONDITIONS "
–hive-delims-replacement ’ < br / >’
–num-mappers 1
–fields-terminated-by $field_segmentation
–target-dir $external_storage_path/ods_tb_name_tmp
–delete-target-dir
–null-string ‘\N’
–null-non-string ‘\N’
–hive-import
–hive-database $hive_database
–hive-table ods_tb_name_tmp
–hive-overwrite \
2.修改Hive表分区为动态分区
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
3.执行hive语句,将ods_tb_name_tmp表数据动态更新到Hive分区表ods_tb_name中。
删除ods_tb_name_tmp 。
insert_ods_tb_name_sql="
use $hive_database;
insert overwrite table ods_tb_name partition(dt)
select trans_idx,trans_tp, up_dtime,down_dtime,card_no,card_tp,company_id,company_nm,line_id,line_nm,bus_num,up_station_nm,down_station_nm,trans_ts,settle_dt,trans_at,chn_proc_st,rec_crt_ts ,dt
from ods_tb_name_tmp
;
drop table ods_tb_name_tmp ;
"
$ hive -e “$insert_ods_tb_name_sql”