从业务系统导入数据到hive时往往是根据业务日期做增量更新, 而hive默认是不支持单行数据修改和删除的, 一般方案就是数据按业务日期做分区, 这样就可以每天进行分区的覆盖更新,实现过程如下:
1. 使用sqoop把数据写入临时order_tmp表, 表结构如下:
CREATE TABLE if not exists `order_tmp`( `order_id` string, `order_type` int, `create_time` string, `user_id` string, `amont` double, `dt` string) COMMENT 'Imported by sqoop on 2017/05/02 17:34:49';
2. 正式表order表结构如下, 其中tmp表的dt字段将用于正式表的分区字段
CREATE TABLE if not exists `order`( `order_id` string, `order_type` int, `create_time` string, `user_id` string, `amont` double) COMMENT 'Imported by sqoop on 2017/05/02 17:34:49' partitioned by (dt string) stored as rcfile;
3.把tmp表数据更新到正式表, 实现动态分区
###设置动态分区 set hive.exec.dynamic.partition.mode=nonstrict; SET hive.exec.max.dynamic.partitions=100000; SET hive.exec.max.dynamic.partitions.pernode=100000; ###默认以查询结果的最后一个字段作为动态分区字段 INSERT OVERWRITE TABLE order PARTITION (ts) select * from order_tmp;
Leave a Reply