sqoop导入数据到hive动态分区表

场景:业务库中的流水数据采集到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”

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值