【大数据hive】hive 拉链表设计与实现

目录

一、前言

二、拉链表业务背景

2.1 数据同步引发的问题

2.1.1 解决方案1

2.1.2 解决方案2

2.1.3 解决方案3

三、拉链表设计与原理

3.1 功能与应用场景

3.2 实现步骤

3.2.1 Step1

3.2.2  Step2

3.2.3 Step3

3.3 操作演示

3.3.1 创建一张表并加载数据

3.3.2 模拟增量数据变化

3.3.3 合并数据


一、前言

做过电商开发的同学对订单的业务应该不陌生,比如对一条订单数据来说,通常会有一个类似于status的字段来标识这个订单的完整的生命周期,从存储的数据来看,一张表只需要存储这一条数据即可。

但是对于数据分析来看,为了跟踪这个订单的全生命周期的完整过程来说,这并不是一个很好的设计,假如说订单到已支付但未发货,而且在未发货这一步停留的时间很长,对于大数据分析场景来说,这就是一个重要的分析场景,但对于mysql存储的订单表来说,这就有些冗余了。这也就是说,mysql在设计表的时候,是会充分考虑冗余数据量带来的性能问题。

二、拉链表业务背景

我们知道,Hive在实际工作中主要用于构建离线数据仓库,定期的从各种数据源中同步采集数据到Hive中,经过分层转换提供数据给上层其他应用使用。

例如:有一个定时任务每天从MySQL中同步最新的订单信息、用户信息、店铺信息等到数据仓库中,从而进行订单分析、用户分析等。

如下图所示,为一个数仓简单的业务流程图;

2.1 数据同步引发的问题

有下面这样一张用户表tb_user,有过开发经验的同学对类似的订单表应该不陌生,比如每次注册完一个用户后,该表中就会产生一条新的数据,记录了该用户的id、手机号码、用户名、性别、地址等信息。

关于该表在业务中的具体使用场景如下:

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

数据同步的过程大概长下面这样

 比如说,在2021-01-01这一天,MySQL中有10条用户信息;

然后通过中间程序(或其他方式)同步到下面的Hive表中了;

现在,假如在 2021-01-02 这一天,在前一天的基础上,MySQL中新增了2条用户注册数据,并且其中有1条用户数据发生更新,

  • 新增两条用户数据011和012;
  • 008的addr发生了更新,从gz更新为sh;

到了2021-01-03这天,Hive需要对2号的数据进行同步更新处理,此时问题来了:

新增的数据会直接加载到Hive表中,但是更新的数据如何存储在Hive表中?

2.1.1 解决方案1

在Hive中用新的addr覆盖008的老的addr,直接更新

 这么做的优点是:实现最简单,使用起来最方便,但缺点也是很明显的,没有历史状态,008的地址是1月2号在sh,但是1月2号之前是在gz的,如果要查询008的1月2号之前的addr就无法查询,也不能使用sh代替;

2.1.2 解决方案2

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

这样做的优点是:记录了所有数据在不同时间的状态, 缺点:冗余存储了很多没有发生变化的数据,导致存储的数据量过大;

2.1.3 解决方案3

构建拉链表,通过时间标记发生变化的数据的每种状态的时间周期,如下图表中数据所示,它大意就是,当一条数据中的关键业务标识字段发送了变化,将新增加一条数据,将这条数据的过期时间设置的非常大,作为这条数据的边界,同样主键的数据再次过来的时候,在新增的一条记录中只需要记录变化的字段即可;关于拉链表,下文将做详细的讲述;

三、拉链表设计与原理

3.1 功能与应用场景

拉链表专门用于解决在数据仓库中数据发生变化如何实现数据存储的问题。

拉链表的设计是将更新的数据进行状态记录,没有发生更新的数据不进行状态存储,用于存储所有数据在不同时间上的所有状态,通过时间进行标记每个状态的生命周期,查询时,根据需求可以获取指定时间范围状态的数据,默认用9999-12-31等最大值来表示最新状态。

如下图所示,记录了某些订单的完整生命周期;

3.2 实现步骤

用下面这张图来说明其完整的实现过程

具体来说,操作步骤如下:

3.2.1 Step1

增量采集变化数据,放入增量表中。

3.2.2  Step2

将Hive中的拉链表与临时表的数据进行合并,合并结果写入临时表。

3.2.3 Step3

将临时表的数据覆盖写入拉链表中。

3.3 操作演示

准备一份原始数据,内容如下

3.3.1 创建一张表并加载数据

--创建拉链表
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';

--加载模拟数据
load data local inpath '/usr/local/soft/selectdata/zipper.txt' into table dw_zipper;

执行过程

 检查数据是否加载进去

3.3.2 模拟增量数据变化

下面为两条新增的数据,以及一条变化的数据

创建一张增量表,并加载数据

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';

load data local inpath '/usr/local/soft/selectdata/update.txt' into table ods_zipper_update;

 执行过程

检查数据是否加载成功

 

3.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 ;

执行上面的sql

覆盖拉链表

insert overwrite table dw_zipper
select * from tmp_zipper;

执行过程

执行完成后,检查拉链表的数据,可以看到新增了2条数据,同时对于相同的那条数据做了时间上的更新;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/31307.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

segment anything环境配置与使用测试

硬件&#xff1a;RTX3070 i9-11900H 内存16G 目录 一、环境配置 二、使用测试--predictor_example.ipynb 1.jupyter notebook准备操作 2.Object masks from prompts with SAM与Environment Set-up 3.Set-up 4.Example image 5.Selecting objects with SAM 6.Specifyin…

在openSUSE-Leap-15.5-DVD-x86_64的gnome下使用远程桌面tigervnc

在openSUSE-Leap-15.5-DVD-x86_64的gnome下使用远程桌面tigervnc 在openSUSE-Leap-15.5-DVD-x86_64的tigervnc-1.12.0软件设计有变动了&#xff0c;变为一开机就启动远程桌面服务&#xff0c;没有vncserver取而代之是Xvnc&#xff0c;也在自己之前写的一篇博文的基础上作了修改…

开源大型语言模型(llm)总结

大型语言模型&#xff08;LLM&#xff09;是人工智能领域中的一个重要研究方向&#xff0c;在ChatGPT之后&#xff0c;它经历了快速的发展。这些发展主要涉及以下几个方面&#xff1a; 模型规模的增长&#xff1a;LLM的规模越来越大&#xff0c;参数数量显著增加。这种扩展使得…

Elasticsearch:DSL Query

Query DSL的分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有的数据&#xff0c;一般测试用&#xff0c;例如&#xff1a;match_all&#xff0c;但有分页限制&#xff0c;一次20…

i5 3470+XSB75M-PK+HD 7750安装黑苹果macOS Big Sur 11.7.7

我本次使用的是 HD 7750 进行安装黑苹果&#xff08;闲鱼80元买的&#xff09;&#xff0c;这款显卡直接就是免驱&#xff0c;最高可以安装的版本是 macOS Monterey &#xff0c;但是建议安装至 macOS Big Sur 以获得较好的体验。 EFI&#xff08;OC引导&#xff09; EFI.zip …

【网络2】MII MDIO

文章目录 1.MII&#xff1a;ISO网络模型中物理层&#xff08;phy&#xff09;和数据链路层&#xff08;mac&#xff09;属于硬件&#xff0c;其余都属于软件kernel2.MDC/MDIO&#xff1a;不仅管phy&#xff0c;只要支持mdio协议都可以管2.1 3.RGMII时序调整&#xff1a;下面波形…

2023-06-19 Untiy进阶 C#知识补充2——C#版本与Unity的关系

文章目录 一、Unity 与 C# 版本二、Unity 的 .Net API 兼容级别 一、Unity 与 C# 版本 Unity 版本C# 版本Unity 2021.2C# 9Unity 2020.3C# 8Unity 2019.4C# 7.3Unity 2017C# 6Unity 5.5C# 4 ​ 更多信息可以在 Unity 官网说明查看&#xff1a;Unity - Manual: C# compiler (u…

EMC学习笔记(七)阻抗控制(一)

阻抗控制&#xff08;一&#xff09; 1.特征阻抗的物理意义1.1 输入阻抗1.2 特征阻抗1.3 偶模阻抗、奇模阻抗、差分阻抗 2.生产工艺对阻抗控制的影响 1.特征阻抗的物理意义 1.1 输入阻抗 在集总电路中&#xff0c;输入阻抗是经常使用的一个术语 &#xff0c;它的物理意义是: …

在 Debian 12 上安装 KubeSphere 实战入门

老 Z&#xff0c;运维架构师&#xff0c;云原生爱好者&#xff0c;目前专注于云原生运维&#xff0c;云原生领域技术栈涉及 Kubernetes、KubeSphere、DevOps、OpenStack、Ansible 等。 前言 知识点 定级&#xff1a;入门级KubeKey 安装部署 KubeSphere 和 KubernetesDebian 操…

arm64架构的linux中断分析(一)

文章目录 1. 中断的概念和作用2. Linux中断处理机制2.1 中断请求2.2 中断处理2.3 中断完成2.4.中断触发和处理步骤详解2.4.1 异常向量表的解读 2.5 硬件中断号和软件中断号 1. 中断的概念和作用 当计算机的CPU需要在执行任务的同时响应外部事件时&#xff0c;中断是一种重要的…

6月份读书学习好文记录

看看CHATGPT在最近几个月的发展趋势 https://blog.csdn.net/csdnnews/article/details/130878125?spm1000.2115.3001.5927 这是属于 AI 开发者的好时代&#xff0c;有什么理由不多去做一些尝试呢。 北大教授陈钟谈 AI 未来&#xff1a;逼近 AGI、融进元宇宙&#xff0c;开源…

kafka消息队列的初步探索

消息队列的作用就是提高运行速度&#xff0c;防止线程堵塞。 kafka的作用 异步 通过在消息队列发送消息的方式&#xff0c;将对应的业务作为监听者&#xff0c;此时我们只需要考虑发送消息的时间即可&#xff0c;大大提高了运行的速度。 解耦 如果使用原来的直接调用对应业务的…

Spring高手之路6——Bean生命周期的扩展点:BeanPostProcessor

文章目录 1. 探索Spring的后置处理器&#xff08;BeanPostProcessor&#xff09;1.1 BeanPostProcessor的设计理念1.2 BeanPostProcessor的文档说明 2. BeanPostProcessor的使用2.1 BeanPostProcessor的基础使用示例2.2 利用BeanPostProcessor修改Bean的初始化结果的返回值2.3 …

Nacos配置中心交互模型是push还是pull?

对于Nacos大家应该都不太陌生&#xff0c;出身阿里名声在外&#xff0c;能做动态服务发现、配置管理&#xff0c;非常好用的一个工具。然而这样的技术用的人越多面试被问的概率也就越大&#xff0c;如果只停留在使用层面&#xff0c;那面试可能要吃大亏。 比如我们今天要讨论的…

leetcode216. 组合总和 III(回溯算法-java)

组合总和 III leetcode216. 组合总和 III题目描述解题思路代码演示 回溯算法专题 leetcode216. 组合总和 III 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/combination-sum-iii 题目描述 找出所有相加之和为 n 的 k 个…

ldsc python程序安装以及测试

教程参考&#xff1a; https://zhuanlan.zhihu.com/p/379628546https://github.com/bulik/ldsc 1. 软件安装 1.1 windows安装教程 首先配置&#xff1a; anaconda&#xff0c;为了需要conda环境git&#xff0c;为了下载github中的ldsc程序 打开windows电脑中的promote&am…

阿里云服务器价格如何?与其他云服务提供商的价格对比如何?

阿里云服务器价格如何&#xff1f;与其他云服务提供商的价格对比如何&#xff1f;   阿里云服务器价格概述   作为全球领先的云计算服务提供商&#xff0c;阿里云在确保服务器性能和安全性的同时&#xff0c;也非常注重产品的价格竞争力。阿里云服务器&#xff08;ECS&…

基于STM32 ARM+FPGA的电能质量分析仪方案(一)硬件设计

本章主要给出了本系统的设计目标和硬件设计方案&#xff0c;后面详细介绍了硬件电路的设计 过程&#xff0c;包括数据采集板、 FPGAARM 控制板。 3.1系统设计目标 本系统的主要目的是实现电能质量指标的高精度测量和数据分析&#xff0c;其具体技术指标如 下所示&#xff1…

微服务中常见问题

Spring Cloud 组件 Spring Cloud五大组件有哪些&#xff1f; Eureka&#xff1a;注册中心 Ribbon&#xff1a;负载均衡 Feign&#xff1a;远程调用 Hystrix&#xff1a;服务熔断 Zuul/Gateway&#xff1a;服务网关 随着SpringCloud Alibaba在国内兴起&#xff0c;我们项目中…

C语言/C++ 之 打飞机游戏

【项目简介】 1、设计思想&#xff1a;本项目主要是为了实现打飞机游戏&#xff0c;主要包括5个函数模块&#xff0c;和1个主函数框架。分别是chu_shi_hua();、you_cao_zuo&#xff1b;、wu_cao_zuo();、show()&#xff1b;、main();等。项目完成过程中主要运用了C/C中的输入输…