4 步搞定 Hive 增量更新
Hive 的更新很有趣。
Hive 的表有两种,一种是 managed table, 一种是 external table.
managed table 是 Hive 自动帮我们维护的表,自动分割底层存储文件,自动分区,这些自动化的操作,都是 Hive 封装了与 Hadoop 交互的接口。
external table 只是一种在 Hive 维护的与外部文件的映射。
managed table 与 external table 最大的区别在于删除的时候,external table 默认情况下只是删除表定义,而数据依旧在hadoop 上存储着;managed table 则是表定义连着表数据一起被删除了。
早期的时候, Hive 支持的表操作只有两种:OverWrite 和 Appand
Overwrite 并不是对某一行的数据做更新,而是对整张表做覆盖,所以感觉上 Hive 更像是在做 ETL 里面的 Staging, 而不像是最终存储计算结果的地方。Hive 超强的计算能力可以做为大数据量转换的工具,最终结果将被送到关系型数据库或者其他 Hive 实例上存储。
hortonworks 有一篇提出相关解决方案的文章,介绍了 4步走解决增量更新 Hive 表:
url如下:
https://hortonworks.com/blog/four-step-strategy-incremental-updates-hive
Ingest
Reconcile
Compact
Purge
过程中,用到了四个 Hive 表,分别是:
base_table: 初始化装载源库来的表数据,表示最新数据
incremental_table:用来装载上一次增量更新以来,发生过更改的数据,包括新增,更新,和删除
reconcile_view:以 base_table, incremental_table 计算出来的最新数据,涉及到的操作,有删除,更新,和新增。每一次都要重复计算是不是有些多余,浪费很多对没有变更的数据的重复计算。如果有对数据有分区,只要对有数据更新的分区做增量更新,会有很大效率的提高。
reporting_table:将reconcile_view的数据,装载到 reporting_table中,用它来替换掉 base_table中的数据。
一) 取决于源数据库的服务是否支持直连抽取数据,可以有两种方法完成第一步 ingest, 即 Extract.
File Processing: 由源数据库自发的输出,以文件方式在合理的时间窗口导出
RDBMS Processing (Database Client based ETL): 由 Sqoop 来完成抽取; ETL 工具, kettle, Informatica等;
File Processing :
由数据库软件自带的导入导出,将文件导出一定分隔符分割的文本文件
将这些文本文件放到 Hive 映射的文件夹下面
RDBMS Processing (Database Client based ETL):
- SQOOP: 既可以实现初始化导入,也可以完成增量导入,增量导入的实现,依赖于Sqoop 本身的 check-sum 机制。check-sum 是对 Hive 表中的一行用来做校验数据做了 hash 计算,根据匹配是否来做增量更新。
以下是文章的原文,展示了 Sqoop 的具体用法:
SQOOP is the JDBC-based utility for integrating with traditional
databases.A SQOOP Import allows for the movement of data into either HDFS (a
delimited format can be defined as part of the Import definition) or
directly into a Hive table.The entire source table can be moved into HDFS or Hive using the
“–table” parameter.
sqoop import--connect jdbc:teradata://{host name or ip address}/Database=retail--connection-manager org.apache.sqoop.teradata.TeradataConnManager--username dbc--password dbc--table SOURCE_TBL--target-dir /user/hive/incremental_table -m 1
注**
–table source_TBL: 是指关系型数据库里的原表
–target-dir :Hive 中表对应的存储目录
After the initial import, subsequent imports can leverage SQOOP’s native support for “Incremental Import” by using the “check-column”, “incremental” and “last-value” parameters.
sqoop import--connect jdbc:teradata://{host name or ip address}/Database=retail--connection-manager org.apache.sqoop.teradata.TeradataConnManager--username dbc--password dbc--table SOURCE_TBL--target-dir /user/hive/incremental_table -m 1--check-column modified_date--incremental lastmodified--last-value {last_import_date|last_import_value}
注**
–check-column : 是指定原表中用来做增量判断条件的那一字段
–incremental lastmodified: 指定增量的模式,append 或者 lastmodified.
在数据仓库中,无论是维度表还是事实表,我们总会设计一栏自增列,作为代理键或者主键。这个时候这些键值总是自增长的,因此适合采用 append 形式,指定check-sum 列为自增列,如果有比 {last_import_value}大的值,就会被 sqoop 导入进来;
在设计数据库的时候,为了审计,我们通常也会设计一列为 timestamp 列,每对一行做了修改,就会重置这列 timestamp 为当前时间戳。如果是针对这类行数据,我们要指定的便是 lastmodified, 配合 check-sum 设置为 timestamp 列,sqoop 就会导入比{last_import_date} 大的数据行。
–last-value { last_import_date } 这是需要从程序外面传进来的
考虑到这是增量更新,那么理应把 sqoop 做成一个 Job 来自动化运行,并且记录每一次的时间,作为下次运行时要传入的 {last_import_date} 或者{last_import_value}
Alternately, you can leverage the “query” parameter, and have SQL select statements limit the import to new or changed records only.
sqoop import--connect jdbc:teradata://{host name or ip address}/Database=retail--connection-manager org.apache.sqoop.teradata.TeradataConnManager--username dbc--password dbc--target-dir /user/hive/incremental_table -m 1--query 'select * from SOURCE_TBL where modified_date > {last_import_date} AND $CONDITIONS’
Note: For the initial load, substitute “base_table” for “incremental_table”. For all subsequent loads, use “incremental_table”.
注**
这是前面两种全量和增量的替代写法,用指定的查询,从原关系型数据库导出数据,不同的是,全量的时候,要指定导入的 Hive 目标表是 base_table, 而增量的时候,导入的是 incremental_table.
二) Reconciliation 将新旧数据综合起来
初始化时,装载最终的目标表没有多少难度。
在这段中,主要解决的问题是增量与初始化的融合。
初始化的数据,存储在 base_table 中, 而增量数据我们已经装载到了 incremental_table 中。
将两者的数据合二为一,就可以生成与源数据库一致的最新数据。
前提是源数据库的任何数据行不接受硬删除即delete 操作,而是在行上打了一个软删除的标签,表示该行已删除。
如果是做了硬删除,那么同时也要做好删除的审计,将删除的数据行放入审计表中,一同发送给 incremental_table .
base_table
CREATE TABLE base_table (id string,field1 string,field2 string,field3 string,field4 string,field5 string,modified_date string)ROW FORMAT DELIMITEDFIELDS TERMINATED BY ','LOCATION '/user/hive/base_table';
incremental_table
CREATE EXTERNAL TABLE incremental_table (id string,field1 string,field2 string,field3 string,field4 string,field5 string,modified_date string)ROW FORMAT DELIMITEDFIELDS TERMINATED BY ','LOCATION '/user/hive/incremental_table';
reconcile_view
CREATE VIEW reconcile_view ASSELECT t2.id, t2.field1, t2.field2, t2.field3, t2.field4, t2.field5, t2.modified_date FROM(SELECT *,ROW_NUMBER() OVER (PARTITION BY id ORDER BY modified_date DESC) rnFROM (SELECT * FROM base_tableUNION ALLSELECT * FROM incremental_table)t1) t2WHERE rn = 1;
从最后一个view定义来解说,incremental_table 必须拥有增量记录的全部,因此硬删除操作就不会反应在 incremental_table 里头。
但是 reconcile_view 所涉及的量毕竟有限,浪费明明不会更改的那部分数据的计算。
因此如果能做好分区,仅仅对某几个分区做全量更新会更高效。
三) Compact: 物化视图,即将reconciliation_view 装载到 reporting_table 里面去
reporting_table
DROP TABLE reporting_table;CREATE TABLE reporting_table ASSELECT * FROM reconcile_view;
首先是要将之前的 reporting_table 删除,再重建 reporting _table, 用 reconciliation_view 填充这张表。
在这张表的基础上,可以做很多聚合,过滤等操作,进行数据二次加工。
四) Purge: 将多余的表数据清空
base_table :应该当换成 reporting_table 里面的数据
incremental_table: 清空
DROP TABLE base_table;CREATE TABLE base_table ASSELECT * FROM reporting_table;hadoop fs –rm –r /user/hive/incremental_table/*
总结:
Oozie 可以将这4步统一做成一个工作流,方便调度
可以用脚本自定义工作流,就像数据仓库的 ETL 一样
4 步搞定 Hive 增量更新相关推荐
- 数仓实战|两步搞定Hive数据加载到Greenplum
如果说Hive是离线数仓的代表,那么Greenplum就是MPP数据库的代表.在离线数仓的年代,以Hive为核心的数据仓库席卷数据仓库市场,几乎成为了离线数仓的代名词.但是Hive的查询能力非常弱,通 ...
- ssd linux 硬盘备份,SSD最佳备份良伴 群晖3步搞定系统备份
原标题:SSD最佳备份良伴 群晖3步搞定系统备份 "秒速开机"--据说90%的人都是因为这句话而知道的SSD固态硬盘.相比于机械硬盘,SSD固态硬盘开机快.关机快.打开软件快.载入 ...
- linux 无法定位程序,三步搞定无法定位程序输入点 于动态链接库上
三步搞定无法定位程序输入点 于动态链接库上 发布时间:2018-09-17 09:24 来源:互联网 当前栏目:电脑教程 上网的时候突然咚的一声弹出一个错误提示框,上边写着 iexplore.exe ...
- 我是如何一步一步搞定小区的安防系统
前言 博主从小就是一个喜欢把事情简单化的男人,但是现实总是在不经意间给你太多的惊喜,比如不停的搬家. 博主从大学毕业到现在前前后后凑足了10次搬家运动,终于在第10次搬家的时候搬进了真正属于自己的房子 ...
- xbox虚拟服务器,小白玩家看这里!国行Xbox One快速上手攻略 四步搞定
小白玩家看这里!国行Xbox One快速上手攻略 四步搞定 2014-09-25 10:55:04来源:游戏下载编辑:评论(0) 还有4天时间国行Xbox One就将与大陆玩家见面了,想想还是有点小激 ...
- lr 获取html格式,Lightroom Tips:LR导入RAW的技巧,一步搞定RAW的文件风格(非教科书版本) | 周鸣超博客...
我的博客正式上线了,在以后的日子里面,我至少每个周六都会更新一篇文章,关于Lightroom.Photoshop或者是我自己的一些拍摄照片,部分Lr或者Ps的小技巧不是从书上能学的到的,而是我日常使用 ...
- 最简单的数据地图制作,一共6步搞定!
之前曾给大家介绍过几种制作数据地图的方法. 不过这次,我要分享一个更为直接简单的方法! 从导入数据到出图,一共6步搞定! 关于数据地图的应用,之前在<史上最全的10个数据地图!>一文里,给 ...
- 在线qmc0转换mp3工具_如何将M4A格式的音频转换为MP3格式?只需一步搞定
随着网络技术的发达,会有很多人喜欢在网上下载东西,特别是很喜欢在网上下载音乐,但是下载音乐之后发现是M4A格式?这样用起来很不方便,都喜欢MP3格式的,那么如何将M4A格式的音频转换为MP3格式?今天 ...
- 7步搞定Python数据可视化,业界大牛出品教程,Jupyter、Colab都有在线版
郭一璞 发自 凹非寺 量子位 报道 | 公众号 QbitAI 做图表,谁不会?打开Excel,自动就可以生成各种各样的图表. 但你看这些图表呢? 结合真实地理数据,展现美国每个县的失业率. 全球自然 ...
最新文章
- 阿里云发布第四代神龙架构云计算首次进入5微秒时延时代
- Android中Activity的四种启动模式
- TCP/IP拥塞控制复习
- android 键盘的隐藏与显示
- junit jndi_使用Spring创建用于JUnit测试的JNDI资源
- python爬取今日头条的文章_Python3爬取今日头条有关《人民的名义》文章
- MySQL之父Michael Wideneus:有自己的电脑,我可以做任何事情
- AE “每用户订阅上的所有人SID 不存在”
- Android/Linux之procrank查内存工具
- “无法找到Internet Explorer”的解决方法
- imagemagick /tmp/magick-xxxxxxxx
- mac如何使用命令行删除文件
- Android Studio 打包Jar
- Android7(N)中webview导致应用内语言切换失效
- luogu 2411 白银莲花池 luogu 1606 Lilypad Pond
- 谷歌Imagen,人工智能对语言更加深入理解
- tweenMax代码未定义问题
- 一.隐藏手机下面虚拟键盘(华为,魅族......)
- 基于javaweb+mysql的个人日记管理系统
- ActiveMQ学习 (一) JSM基本概念
热门文章
- NRF24l01无线模块调试心得!STM32_SPI驱动NRF24L01+
- 卷积神经网络原理理解
- 什么软件可以测试色卡颜色,Pantone.inc彩通色卡识别软件
- 三刷CPA注册会计师之会计决胜之道
- h1283命令行下刷机法
- win10输入法变成繁体中文还原成简体中文的方法
- Keil魔术棒上已经设置了ST_Link下载了,但是烧进STM32时却被提示找不到JLink
- 深度学习EMA的注意事项
- python计算ema_python – 添加一个列(EMA),它是pandas中先前新列值的结果
- 【Python数据分析】利用Python删除EXCEL表格中指定的列数据或行数据