大数据Hive拉链表的设计与实现

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 大数据Hive拉链表的设计与实现

1 数据同步问题

1.1 数据同步的场景

Hive在实际工作中主要用于构建离线数据仓库,定期的从各种数据源中同步采集数据到Hive中,经过分层转换提供数据应用。例如,每天需要从MySQL中同步最新的订单信息、用户信息、店铺信息等到数据仓库中,进行订单分析、用户分析。

例如:MySQL中有一张用户表:tb_user,每个用户注册完成以后,就会在用户表中新增该用户的信息,记录该用户的id、手机号码、用户名、性别、地址等信息。

9eccabfb25914f18a2694e9a974f41f1.png

每天都会有用户注册,产生新的用户信息,我们每天都需要将MySQL中的用户数据同步到Hive数据仓库中,在做用户分析时,需要对用户的信息做统计分析,例如统计新增用户的个数、总用户个数、用户性别分布、地区分布、运营商分布等指标。

1.2 数据同步的问题

在实现数据仓库数据同步的过程中,我们必须保证Hive中的数据与MySQL中的数据是一致的,这样才能确保我们最终分析出来的结果是准确的,没有问题的,但是在实现同步的过程中,这里会面临一个问题:如果MySQL中的数据发生了修改,Hive中如何存储被修改的数据?

例如以下情况

➢ 2021-01-01:MySQL中有10条用户信息

➢ 2021-01-02:Hive进行数据分析,将MySQL中的数据同步

⚫ 2021-01-02:MySQL中新增2条用户注册数据,并且有1条用户数据发生更新

◼ 新增两条用户数据011和012

◼ 008的addr发生了更新,从gz更新为sh

⚫ 2021-01-03:Hive需要对2号的数据进行同步更新处理

⚫ 问题:新增的数据会直接加载7.1.3 解决方案

➢ 方案一:在Hive中用新的addr覆盖008的老的addr,直接更新

到Hive表中,但是更新的数据如何存储在Hive表中?

➢ 优点:实现最简单,使用起来最方便

➢ 缺点:没有历史状态,008的地址是1月2号在sh,但是1月2号之前是在gz的,如果要查询008的1月2号之前的addr就无法查询,也不能使用sh代替

➢ 方案二:每次数据改变,根据日期构建一份全量的快照表,每天一张表

➢ 2021-01-02:Hive中有一张表tb_user_2021-01-02

➢ 2021-01-03:Hive中有一张表tb_user_2021-01-03

➢ 优点:记录了所有数据在不同时间的状态

➢ 缺点:冗余存储了很多没有发生变化的数据,导致存储的数据量过大

➢ 方案三:构建拉链表,通过时间标记发生变化的数据的每种状态的时间周期

2 拉链表的设计

2.1 功能与应用场景

拉链表专门用于解决在数据仓库中数据发生变化如何实现数据存储的问题,如果直接覆盖历史状态,会导致无法查询历史状态,如果将所有数据单独切片存储,会导致存储大量非更新数据的问题。拉链表的设计是将更新的数据进行状态记录,没有发生更新的数据不进行状态存储,用于存储所有数据在不同时间上的所有状态,通过时间进行标记每个状态的生命周期,查询时,根据需求可以获取指定时间范围状态的数据,默认用9999-12-31等最大值来表示最新状态。

2.2 实现过程

整体实现过程一般分为三步,第一步先增量采集所有新增数据【增加的数据和发生变化的数据】放入一张增量表。第二步创建一张临时表,用于将老的拉链表与增量表进行合并。第三步,最后将临时表的数据覆盖写入拉链表中。例如:

当前MySQL中的数据:

当前Hive数据仓库中拉链表的数据:

⚫ step1:增量采集变化数据,放入增量表中

⚫ step2:构建临时表,将Hive中的拉链表与临时表的数据进行合并

⚫ step3:将临时表的数据覆盖写入拉链表中

3 拉链表的实现

3.1 数据准备

➢ 创建dw层拉链表

--创建数据库
create database db_zipper;
use db_zipper;
--创建拉链表
create table dw_zipper(
  userid string,
  phone string,
  nick string,
  gender int,
  addr string,
  starttime string,
  endtime string
) row format delimited fields terminated by '\t';
➢ 构建模拟数据:vim /export/data/zipper.txt
```sql
001 186xxxx1234 laoda 0 sh  2021-01-01  9999-12-31
002 186xxxx1235 laoer 1 bj  2021-01-01  9999-12-31
003 186xxxx1236 laosan  0 sz  2021-01-01  9999-12-31
004 186xxxx1237 laosi 1 gz  2021-01-01  9999-12-31
005 186xxxx1238 laowu 0 sh  2021-01-01  9999-12-31
006 186xxxx1239 laoliu  1 bj  2021-01-01  9999-12-31
007 186xxxx1240 laoqi 0 sz  2021-01-01  9999-12-31
008 186xxxx1241 laoba 1 gz  2021-01-01  9999-12-31
009 186xxxx1242 laojiu  0 sh  2021-01-01  9999-12-31
010 186xxxx1243 laoshi  1 bj  2021-01-01  9999-12-31

➢ 加载拉链表数据

–加载模拟数据

load data local inpath ‘/export/data/zipper.txt’ into table dw_zipper;

➢ 查询数据

select userid,nick,addr,starttime,endtime from dw_zipper;

3.2 增量采集

➢ 创建ods层增量表

create table ods_zipper_update(
  userid string,
  phone string,
  nick string,
  gender int,
  addr string,
  starttime string,
  endtime string
) row format delimited fields terminated by '\t';

➢ 创建模拟数据:vim /export/data/update.txt

008 186xxxx1241 laoba 1 sh 2021-01-02 9999-12-31

011 186xxxx1244 laoshi 1 jx 2021-01-02 9999-12-31

012 186xxxx1245 laoshi 0 zj 2021-01-02 9999-12-31


➢ 加载更新数据

load data local inpath ‘/export/data/update.txt’ into table ods_zipper_update;


➢ 查询数据select userid,nick,addr,starttime,endtime from ods_zipper_update;

3.3 合并数据

➢ 创建临时表
create table tmp_zipper(
  userid string,
  phone string,
  nick string,
  gender int,
  addr string,
  starttime string,
  endtime string
) row format delimited fields terminated by '\t';

➢ 合并拉链表与增量表

insert overwrite table tmp_zipper
select
  userid,
  phone,
  nick,
  gender,
  addr,
  starttime,
  endtime
from ods_zipper_update
union all
--查询原来拉链表的所有数据,并将这次需要更新的数据的endTime更改为更新值的startTime
select
  a.userid,
  a.phone,
  a.nick,
  a.gender,
  a.addr,
  a.starttime,
  --如果这条数据没有更新或者这条数据不是要更改的数据,就保留原来的值,否则就改为新数据的开始时间-1
  if(b.userid is null or a.endtime < '9999-12-31', a.endtime , date_sub(b.starttime,1)) as endtime
from dw_zipper a  left join ods_zipper_update b
on a.userid = b.userid ;

3.4 生成最新拉链表

➢ 覆盖拉链表

insert overwrite table dw_zipper
select * from tmp_zipper;


相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
1月前
|
SQL 数据采集 数据挖掘
大数据行业应用之Hive数据分析航班线路相关的各项指标
大数据行业应用之Hive数据分析航班线路相关的各项指标
132 1
|
16天前
|
SQL 数据采集 数据可视化
基于Hive的招聘网站的大数据分析系统
基于Hive的招聘网站的大数据分析系统
|
17天前
|
SQL 分布式计算 大数据
MaxCompute产品使用合集之启用hive兼容的时候,某个字段是null,是否会把这个字段当成空白连起来
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
16天前
|
SQL 关系型数据库 MySQL
基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)
基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)
|
1月前
|
SQL 存储 Java
Hive 拉链表详解及实例
拉链表是一种数据仓库技术,用于处理持续增长且存在时间范围内的重复数据,以节省空间。它在Hive中通过列式存储ORC实现,适用于大规模数据场景,尤其当数据在有限时间内有多种状态变化。配置涉及事务管理和表合并选项。示例中展示了如何从原始订单表创建拉链表,通过聚合操作和动态分区减少数据冗余。增量数据可通过追加到原始表然后更新拉链表来处理。提供的Java代码用于生成模拟的订单增量数据,以演示拉链表的工作流程。
72 3
|
1月前
|
SQL 分布式计算 Hadoop
利用Hive与Hadoop构建大数据仓库:从零到一
【4月更文挑战第7天】本文介绍了如何使用Apache Hive与Hadoop构建大数据仓库。Hadoop的HDFS和YARN提供分布式存储和资源管理,而Hive作为基于Hadoop的数据仓库系统,通过HiveQL简化大数据查询。构建过程包括设置Hadoop集群、安装配置Hive、数据导入与管理、查询分析以及ETL与调度。大数据仓库的应用场景包括海量数据存储、离线分析、数据服务化和数据湖构建,为企业决策和创新提供支持。
202 1
|
1月前
|
SQL 分布式计算 大数据
[AIGC 大数据基础]hive浅谈
[AIGC 大数据基础]hive浅谈
|
1月前
|
SQL 数据可视化 关系型数据库
【大数据实训】基于Hive的北京市天气系统分析报告(二)
【大数据实训】基于Hive的北京市天气系统分析报告(二)
125 1
|
1月前
|
SQL 监控 HIVE
Hive 全量表、增量表、拉链表 解析
Hive 全量表、增量表、拉链表 解析
284 0
|
8月前
|
SQL Java 大数据
Hive实战(03)-深入了解Hive JDBC:在大数据世界中实现数据交互
Hive实战(03)-深入了解Hive JDBC:在大数据世界中实现数据交互
316 1