认识数仓拉链表

2023-12-21 01:36
文章标签 认识 数仓 拉链

本文主要是介绍认识数仓拉链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据仓库之拉链表

在数据仓库领域,拉链表是一种非常重要的数据结构,它能够对数据进行有效的组织和处理。本文将详细介绍拉链表的概念、应用、优缺点以及实现方法,帮助读者更好地理解和掌握数据仓库中的拉链表技术。

场景问题

在数据仓库的数据模型设计过程中,经常会遇到下面这种表的设计:

有一些表的数据量很大,比如一张用户表,大约有亿级别记录,几十个字段,这种表,即使使用ORC压缩,单张表的存储也会超过100G,在HDFS使用双备份或者三备份的话就更大一些。

表中的部分字段会被update更新操作,如用户联系方式,产品的描述信息,订单的状态等等。

需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态。

表中的记录变化的比例和频率不是很大,比如,总共有10亿的用户,每天新增和发生变化的有200万左右,变化的比例占的很小。

那么对于这种表我该如何设计呢?下面有几种方案可选:

  1. 方案一:每天只留最新的一份,比如我们每天用Sqoop抽取最新的一份全量数据到Hive中。
  2. 方案二:每天保留一份全量的切片数据。
  3. 方案三:使用拉链表。

什么是拉链表

一、拉链表的概念

拉链表(Linked Chunked Blocks,简称 SCB)是一种数据存储方式,它可以将一块连续存储空间划分成多个块,每个块包含多个数据项。每个块都有一个头部和一个尾部,头部记录了该块的数据类型、大小等信息,尾部则记录了下一个块的地址。通过这种方式,拉链表可以实现数据的连续存储和非连续存储,从而满足不同场景下的需求。

二、拉链表的应用

拉链表作为一种高效的数据结构,在数据仓库领域有着广泛的应用。以下是几个典型的场景:

数据缓存:在数据仓库中,经常需要将大量数据加载到内存中进行处理。拉链表可以将数据按照块的方式组织,每个块包含多个数据项,从而减少内存的碎片化,提高数据加载和处理效率。
索引构建:在构建索引时,拉链表可以用来存储索引的倒排列表。通过将倒排列表分成多个块,每个块包含多个倒排项,可以实现对倒排列表的高效存储和查询。
数据分片:在分布式数据仓库中,需要将数据分成多个分片,存储在不同的节点上。拉链表可以将数据按照块的方式进行分片,每个块包含多个数据项,从而实现数据的分布式存储和处理。

三、拉链表的优缺点

拉链表作为一种常用的数据结构,具有以下优点:

高效的空间利用率:拉链表可以将一块连续的存储空间划分成多个块,每个块包含多个数据项,从而减少内存的碎片化,提高空间利用率。
高性能的数据加载和处理:由于拉链表可以将数据分成多个块,可以实现对数据的批量加载和处理,从而提高数据加载和处理效率。
灵活的数据组织方式:拉链表可以根据需要将数据分成不同的块大小和块数,从而实现数据的灵活组织和管理。
然而,拉链表也存在以下缺点:

写入性能问题:在写入数据时,需要将数据分成多个块,并维护每个块之间的链接关系,这会增加写入操作的复杂性,降低写入性能。
内存占用问题:由于拉链表需要维护每个块之间的链接关系,因此需要占用一定的内存空间。当数据量较大时,这些额外的内存开销可能会对系统性能产生影响。
数据访问限制:由于拉链表的每个块之间是通过链接关系相互连接的,因此在访问某个块的数据时,需要先加载该块的所有数据项。这可能会增加数据的访问延迟和系统负载。

四、拉链表的实现方法

下面介绍两种常见的实现方法:

内存实现:在内存中实现拉链表可以使用数组或链表来实现每个块的数据存储和链接关系。例如,可以使用一个数组来存储所有块的首地址,然后使用一个指针来指向当前块的下一个块。当需要访问某个块的数据时,可以首先加载该块的所有数据项,然后通过指针访问下一个块的数据项。
磁盘实现:在磁盘中实现拉链表可以使用文件或数据库来实现每个块的数据存储和链接关系。例如,可以使用一个文件来存储所有块的数据项和链接关系信息。当需要访问某个块的数据时,可以首先读取该块的头部信息,然后根据链接关系依次读取下一个块的数据项。

我们先看一个示例,这就是一张拉链表,存储的是用户的最基本信息以及每条记录的生命周期。我们可以使用这张表拿到最新的当天的最新数据以及之前的历史数据。

time_id用户编号手机号码start_dateend_datestate
2023-12-010011101202023-12-019999-12-310
2023-12-010021191202023-12-019999-12-310
2023-12-01003333332023-12-019999-12-310
2023-12-02004444442023-12-029999-12-310
2023-12-030011101202023-12-012023-12-031
2023-12-03005555552023-12-039999-12-310
2023-12-040044444442023-12-022023-12-041

我们能拿到历史状态用到的SQL

select state from model_aaa WHERE start_date <='查询日' and  end_date > '查询日'  -- 此处要好好理解,是拉链表比较重要的一块。)

拉链表在Hive中的实现

在现在的大数据场景下,大部分的公司都会选择以Hdfs和Hive为主的数据仓库架构。目前的Hdfs版本来讲,其文件系统中的文件是不能做改变的,也就是说Hive的表智能进行删除和添加操作,而不能进行update。基于这个前提,我们来实现拉链表。

在Hive中,拉链表可以通过使用视图来实现。视图是一个虚拟表,它可以根据一定的条件和规则从底层数据源中提取数据。在使用视图时,我们可以将拉链表的基本原理和更新策略以SQL语句的形式表达出来,从而实现拉链表的功能。

例如,我们可以创建一个名为“pivot_table”的视图,该视图根据时间戳对数据进行分组,并将最新版本的数据作为结果返回。具体SQL语句如下:

CREATE VIEW pivot_table AS
SELECT key, MAX(timestamp) AS timestamp, value
FROM (SELECT key, timestamp, value, ROW_NUMBER() OVER (PARTITION BY key ORDER BY timestamp DESC) AS row_numFROM table_name
) AS sorted
WHERE row_num = 1
GROUP BY key, value;

该SQL语句首先使用子查询将数据按照主键和时间戳进行排序,并给每个节点分配一个行号。然后,使用聚合函数MAX()和ROW_NUMBER()函数将最新版本的数据作为结果返回。最后,使用GROUP BY语句将结果按照主键和值进行分组。

通过使用视图,我们可以很方便地实现拉链表的功能,并大大提高数据仓库的效率和性能。

这篇关于认识数仓拉链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

SpringMVC-1.认识及配置

SpringMVC是一个基于请求驱动的Web框架,和structs一样是目前最优秀的基于MVC框架,现在的项目一般都使用SpringMVC代替Structs。 MVC模式中,Model是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象在数据库中存取数据。View是应用程序中处理数据显示的部分,通常视图是依据模型数据创建。Controller是应用程序中处理用户交互的部分。通常控制器负责从视

【H2O2|全栈】关于HTML(1)认识HTML

HTML相关知识 目录 前言 准备工作 WEB前端是什么? HTML是什么? 如何运行HTML文件? 标签 概念 分类 双标签和单标签 行内标签和块标签 HTML文档结构 预告和回顾 UI设计相关 Markdown | Md文档相关  项目合作管理相关  后话 前言 本系列的博客将分享前端HTML的相关知识点。 本篇作为本系列的第一期博客,主要讲解H

认识鬼火引擎

一、Irrlicht简介 (1)概念Irrlicht引擎是一个用C++书写的高性能实时3D引擎,可以应用于C++程序或者.NET语言中。通过使用Direct3D(Windows平台)、OpenGL 或它自己的软件着色程序,可以实现该引的完​全跨平台。尽管是开源的,该Irrlicht库提供了可以在商业级的3D引擎上具有的艺术特性,例如动态的阴影,粒子系统,角色动画,室内和室外技术以及碰撞检测等。(

Jenkins--pipeline认识及与RF文件的结合应用

什么是pipeline? Pipeline,就是可运行在Jenkins上的工作流框架,将原本独立运行的单个或多个节点任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。 为什么要使用pipeline? 1.流程可视化显示 2.可自定义流程任务 3.所有步骤代码化实现 如何使用pipeline 首先需要安装pipeline插件: 流水线有声明式和脚本式的流水线语法 流水线结构介绍 Node:

git:认识git和基本操作(1)

目录 一、版本控制器 1.安装git 2.创建git本地仓库 3.配置git 二、git操作(1) 1.工作区、暂存区、版本库 2.添加文件 3.查看.git 4.修改文件 一、版本控制器         所谓的版本控制器,就是能让你了解到每一个文件的修改历史。相应的,在企业级开发中,用来记录一个工程的每一次改动和管理版本迭代,同时方便多人协作开发。         g

关于MANIFEST.MF的内容认识

文章来源 https://baike.baidu.com/item/MANIFEST.MF https://www.cnblogs.com/Gandy/p/7290069.html 一、百度百科关于MANIFEST.MF文件介绍 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了

C++---由优先级队列认识仿函数

文章目录 一、优先级队列是什么? 二、如何使用优先级队列 1、优先级队列容器用法 2、为什么容器本身无序? 三、什么是仿函数? 1. 什么是仿函数? 2. 仿函数的优势 四、仿函数如何使用? 1、重载operator()函数 2、运用第三个参数模板 3、大小堆切换  大堆测试代码: 小堆测试代码: 4、头文件总代码  五、什么是容器适配器? 前言   本文主要介绍了优先级队列是什