步骤2:通过Hive将“全量表+增量表”合并为“更新后的全量表”,覆盖当前的全量表
合并新表的逻辑如下:
整个tmp表进入最终表中
all表的数据中不包含在tmp表service_code范围内的数据全部进入新表
执行以下sql语句可以合并得到更新后的全量表:
hive> select * from service_tmp union all select a.* from service_all a left outer join service_tmp b on a.service_code = b.service_code where b.service_code is null;
我们需要直接将查询结果更新回全量表中:
hive> insert overwrite table service_all select * from service_tmp union all select a.* from service_all a left outer join service_tmp b on a.service_code = b.service_code where b.service_code is null;
注意,将查询结果插入表有以下两类语法:
INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT EXISTS]] select_statement1 FROM from_statement;
INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;
INSERT OVERWRITE 将会覆盖现有数据,由于当前场景需要更新全量表,所以使用了覆盖模式;
INSERT INTO 不会覆盖现有数据,是追加数据
到此为止,Hive中的service_all表已经更新为最新的数据!
在真实场景中,需要结合shell+cron实现该过程的定时执行。
通过Sqoop实现Mysql / Oracle 与HDFS / Hbase互导数据
Hadoop Oozie学习笔记 Oozie不支持Sqoop问题解决