SQOOP增量抽取时,在HIVE中实现类似Oracle的merge操作

数据仓库建设中的数据抽取环节,常常需要增量抽取业务库数据。但业务库数据不是一层不变的,会根据时间发生状态变更,那么就需要同步更新变化数据到HIVE中。过去在Oracle上做数据仓库时,可以使用merge的方法合并新老数据。但hive中没有该功能,本文旨在通过sqoop抽取后,自动实现数据合并。

表设计

将抽取表分为三张,

  1. 一张_arc表,保存每日合并后的快照,根据pt字段分区
  2. 一张_inc表,用于保存当日抽取的增量数据,根据pt字段分区
  3. 一张不带后缀的表,指向最终表给后续ETL任务使用。

步骤

  1. 使用sqoop进行hive import,将数据导入_inc表
  2. 核心,使用full join、coalesce、if组合的SQL合并将inc表当日分区数据与arc更前一日分区数据合并到_arc表当日分区中。
  3. 最终表通过hive命令set location指向_arc当日分区。

代码要点:

merge SQL

use ods;
insert overwrite table mytable_arc partition (pt=‘20200407‘)
select coalesce(a.id,b.id), if(a.id is null, b.type, a.type), if(a.id is null, b.amt, a.amt) from (
  select id, type, amt
  from mytable_inc where pt=‘20200407‘
) a full join (
  select id, type, amt
  from mytable_arc where pt=‘20200406‘
) b on a.%s = b.%s"

hive set location

use ods;
alter table mytable set location ‘hdfs://hadoop01:9000/user/hive/warehouse/ods.db/mytable_arc/pt=20200407‘"

原文地址:https://www.cnblogs.com/hupingzhi/p/12654898.html

时间: 2024-07-29 06:44:10

SQOOP增量抽取时,在HIVE中实现类似Oracle的merge操作的相关文章

Excel中导入到oracle使用merge into 差异性更新数据库

merge into temp1 ausing (select ID         from (Select ID                 from temp1                where ID = 'SYSTEM00000100000010846'               union all               select null ID from dual)        where rownum = 1) bOn (b.ID = a.ID)when m

使用Sqoop,最终导入到hive中的数据和原数据库中数据不一致解决办法

Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中. 1.问题背景 使用Sqoop把oracle数据库中的一张表,这里假定为student,当中的数据导入到hdfs中,然后再创建hive的external表,location到刚才保存到hdfs中数

sqoop同步mysql数据到hive中

一.sqoop 在同步mysql表结构到hive sqoop create-hive-table --connect jdbc:mysql://ip:3306/sampledata --table t1--username dev --password 1234 --hive-table t1; 执行到这一步就退出了,但是在hadoop的hdfs上的/hive/warehouse/的目录下是找不到t1表的目录, 但是正常执行完成是下面这样的: 错误就是hive的jar包有缺失 全部的jar包该是

利用Sqoop将MySQL数据导入Hive中

参考 http://www.cnblogs.com/iPeng0564/p/3215055.html http://www.tuicool.com/articles/j2yayyj http://blog.csdn.net/jxlhc09/article/details/16856873 1.list databases sqoop list-databases --connect jdbc:mysql://192.168.2.1:3306/ --username sqoop --passwor

ETL中的数据增量抽取机制

ETL中的数据增量抽取机制 (     增量抽取是数据仓库ETL(extraction,transformation,loading,数据的抽取.转换和装载)实施过程中需要重点考虑的问 题.在ETL过程中,增量更新的效率和可行性是决定ETL实施成败的关键问题之一,ETL中的增量更新机制比较复杂,采用何种机制往往取决于源数据系统的 类型以及对增量更新性能的要求. 1 ETL概述 ETL包括数据的抽取.转换.加载.①数据抽取:从源数据源系统抽取目的数据源系统需要的数据:②数据转换:将从源数据源获取的

ETL之增量抽取方式

1.触发器方式 触发器方式是普遍采取的一种增量抽取机制.该方式是根据抽取要求,在要被抽取的源表上建立插入.修改.删除3个触发器,每当源表中的数据发生变化,就被相应的触发器将变化的数据写入一个增量日志表,ETL的增量抽取则是从增量日志表中而不是直接在源表中抽取数据,同时增量日志表中抽取过的数据要及时被标记或删除.为了简单起见,增量日志表一般不存储增量数据的所有字段信息,而只是存储源表名称.更新的关键字值和更新操作类型(KNSEN.UPDATE或DELETE),ETL增量抽取进程首先根据源表名称和更

SqlServer中的merge操作(转载)

SqlServer中的merge操作(转载) 今天在一个存储过程中看见了merge这个关键字,第一个想法是,这个是配置管理中的概念吗,把相邻两次的更改合并到一起.后来在technet上搜索发现别有洞天,原来是另外一个sql关键字,t-sql的语法还是相当地丰富的.本篇是一篇学习笔记,没有什么新意,这里给出technet上的地址连接供大家参考权威:http://technet.microsoft.com/zh-cn/library/bb510625.aspx,这里具体的语法不去深究了,只是把几个例

SQL点滴18—SqlServer中的merge操作,相当地风骚

原文:SQL点滴18-SqlServer中的merge操作,相当地风骚 今天在一个存储过程中看见了merge这个关键字,第一个想法是,这个是配置管理中的概念吗,把相邻两次的更改合并到一起.后来在technet上搜索发现别有洞天,原来是另外一个sql关键字,t-sql的语法还是相当地丰富的.本篇是一篇学习笔记,没有什么新意,这里给出technet上的地址连接供大家参考权威:http://technet.microsoft.com/zh-cn/library/bb510625.aspx,这里具体的语

sqoop 从oracle导数据到hive中,date型数据时分秒截断问题

oracle数据库中Date类型倒入到hive中出现时分秒截断问题解决方案 1.问题描述: 用sqoop将oracle数据表倒入到hive中,oracle中Date型数据会出现时分秒截断问题,只保留了‘yyyy-MM-dd',而不是’yyyy-MM-dd HH24:mi:ss'格式的,后面的‘HH24:mi:ss’被自动截断了,在对时间要求到秒级的分析处理中这种截断会产生问题. 2.解决方案: 在用sqoop倒入数据表是,添加--map-column-hive 和--map-column-jav