Maxcompute拉链表应用(一)在数据开发中使用拉链表

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 最新在项目中进行存储优化的一个事情,于是就又把拉链表抬出来了。

一、概述

从事数据仓库这个职业,每天就写写SQL搞搞数据处理。你要说这写SQL有什么知识点要掌握,能让人脱口而出,面试还会长被问起,大概就只有拉链表了。

之前在Maxcompute存储设计一文中提到过拉链表,相比于产品提供的存储压缩方式,切片表转为拉链表其实是存储“压缩”最好的一种方式。

但是拉链表是一种数据存储结构,如果之前未使用过这种结构,你会发现要实现这种存储结构,原来的表设计要做调整,并且ETL处理逻辑也要跟着调整。这就让本来相对简单的工作变得复杂起来了,所以,如果不是非常有必要这种存储结构很可能就会被弃用。

10年前,当我在数据仓库行业打工赚钱的时候,掌握这种结构是必备的技能。因为传统数据库和MPP数据库存储规模都有限,所以只有这种结构才能让数据仓库定义中的“保留历史变化的数据集合”这一特征。但是在大数据兴起之后,hadoop技术让底层技术平台存储规模从关系型数据库的单台和MPP数据库一般规模的几十台上升到了另外一个规模(成千上万台,比如我们的Maxcompute一个集群的规模就可以达到这个规模),所以,这个技术变得不是那么重要了。

可能读者心中会疑惑,难道服务器不是花钱买的么?凡事都讲成本产出比是工业思维,在互联网思维下不值得一提,快人一步就是生死差别,所以这些成本都被忽略了。但是,在眼下我们看到互联网快人一步决生死的场景逐渐淡去的时候,这些成本我们要不要找回来呢?在非互联网场景,在政府、传统企业中要不要使用这种结构呢?我认为是需要的,即便是在现在的互联网公司,我也觉得推广拉链表也是可以为公司降本增效出一份力。

 

二、拉链表简介

关系数据库的业务操作通常分为三类,一是记录一个对象,二是记录一个事件,三是记录一些代码参数。以时间维度去看这些表的记录数变化,记录对象的表的一般会有小幅增长,代码参数表则基本上不变,而事件表一般都是记录对象表中活跃对象的数倍,一年增加一亿行,五年就至少增加五亿行。理论上这些记录在关系型数据库都会被更新,但是变化频次是不同的。事件型表一般是在短周期内变化,例如一笔购物交易,交易结束后事件表就不会再被更新。记录对象的表则是长周期内会变化,只有这个对象消亡后才可能不再变化。代码参数表一般不会变化,只有系统版本更新变化,增加或者调整一些新的业务和功能时候才会变化。从保留历史的角度去看这三类表,如果空间不足,一般关系型数据库管理员会要求业务系统定期清理冷数据。而这里面清理的主要就是事件表中的历史,一般采用归档备份或者挪到其他归档库这种操作。

拉链表是数据仓库存储历史数据的一种结构。这种结构把表中的每行记录全部字段值作为一个ID,每一次更新都会产生一行新的记录,每一行记录值的生命周期被2个字段“开始日期”“结束日期”记录下来。使用的时候,只需要卡住所需数据在“开始日期”“结束日期”区间内,这行记录就是有效的。这种结构,相对另外一种结构,就是切片表结构。切片表结构就是以分区表为基础的结构,每个最新的日期都会存储一份最新的全量数据,使用的时候只需要访问对应分区就可以获取所需日期分区的数据。相比拉链表,切片表结构随着存储日期数据的变多,其中那些记录值不会变化的数据会被存储多份。如果每天存储一个分区,一年就会被存储365行。这种方式对于那些已经不再更新的记录来说,就是巨大的存储浪费。并且随着存储周期的拉长,这种重复存储会不断增长。

 

我们可以看到,相比拉链表方案切片表方案是一种十分浪费存储的方案。但是我们日常做数据开发,其实很少遇到拉链表。这是为什么呢?

在数据仓库中,这三类表的数据加工ETL过程会被分层架构分解为多层架构来实现。包括:贴源层(临时层+镜像层)、中间层(数据明细层+数据汇总层)、应用层。这种分层架构会让数据加工的过程分解为一些独立的步骤,每一层只需要解决这个步骤需要解决的问题即可,让复杂的处理变得简单,也让数仓的数据和能力复用。

贴源层细分为临时层、镜像层,临时层就是数据第一次在数仓平台落地的存储。这部分数据一般就是以源系统数据发生变化产生的增量数据为主,本身不存在什么冗余。当然也有直接抽取全量业务系统数据库的情况,这种情况临时层和镜像层就是同一层了。镜像层简明扼要就是业务系统表的镜像。如果是数据集成任务全量抽取业务系统的表,那么抽取过来的数据就是业务系统表在抽取时点的一份镜像。如果是抽取增量,那么当日增量合并上日全量就是今日全量。镜像层一般在数据仓库都是切片存储的,根据实际业务需求存储时间是不定的。在大数据兴起之前,我所在参数的银行数仓项目,一般不会超过一个月(少量表,支撑一些纯需要镜像层数据的引用)。

中间层细分为明细层(也有叫基础层)、汇总层,这两层使用贴源层数据加工而来。根据架构细节不同明细层使用不同的贴源层数据加工,使用拉链表结构会使用临时层增量数据,使用切片表结构的则会使用镜像层数据加工。汇总层不会使用拉链表结构,因为汇总层的加工一般较为复杂,涉及聚合、多表关联。如果使用这种结构存储,会让业务开发人员要花费过多精力去构造拉链结构而不是关注业务本身。总的一句话就是:复杂易出错,利益和成本相比是负的。

模型层与汇总层是一个逻辑,仍然不适合使用拉链表(不是绝对,但是代表了绝大部分场景)。

通过上面数仓分层架构中使用拉链表场景的介绍,我们可以看到,真正能适用拉链表的场景就是分层架构中的明细层(基础层)。确实之前我在做银行数仓开发的时候,也只是在这一层使用了拉链表。当时汇总层之前数据在集群的存储占比只有整个存储的20%-30%,大部分存储都是被后面的应用层使用了。


三、拉链表在数仓开发中的实现

拉链表在网上可以搜到不少文章,只是没想到都是基于Hive的。其实我倒是想搜一下之前我做数仓开发时候在关系型数据库的例子,做个对比。奈何现在搞数仓应该最流行Hive了,所以,只查到了这一种。好在Maxcompute也其实就是Hive的阿里版本,所以,这种例子是可以直接拿来用得。

网上文章搜到的场景其实都是一种,就是之前在做数仓基础层的时候使用的,有简单的也有复杂的,但是其实都是一种算法。我记得之前我们的算法(不同场景实现方法)能有五六种,还得好好学习一下。

我找了一个最简洁的SQL实现方法如下:

INSERT OVERWRITE TABLE table_hisroty PARTITION(ds='${bizdate}')

SELECT * FROM

(

   SELECT a.columns --【除了start_date,end_date之外的字段】

         ,a.start_date

         --【关链】

         --今天有更新记录的主键,该主键上日还有效(end_date是未来时点'3000-12-31'),这条记录的结束日期被更新为今天,否则还是之前的end_date

         ,CASE WHEN a.end_date = '3000-12-31' AND B.pk IS NOT NULL THEN '${bizdate}'

               ELSE a.end_date

          END AS end_date

   FROM      table_hisroty a

   LEFT JOIN table_update  b

   ON a.pk = b.pk

UNION

   SELECT b.columns --【除了start_date,end_date之外的字段】

         --【新开链】

         --今天有更新的记录,生成一条心的拉链数据,开始日期是今天,结束日期是未来时点'3000-12-31'

         ,'${bizdate}' AS start_date

         ,'3000-12-31' AS end_date

   FROM ods.user_update b

)t;

参考:https://blog.csdn.net/z69183787/article/details/124480770

其实这个逻辑与我之前在在《如何正确做增量加工》一文中的MERGE逻辑非常类似,新增数据插入,merge旧的与新增数据同PK的数据直接就排除了,而拉链逻辑是关链继续保留。


四、拉链表在应用中的简单性与复杂性

参考上面这段实现SQL,你就可以快速的让你现在切片存储的基础层改造为拉链表了。并且这段SQL其实很简单,按照我的经验这些代码其实都是可以动态生成的,不同的表只需配置一下就可以像实现merge逻辑一样动态生成SQL。好像也不需要什么开发工作量,真的很简单。

但是这种结构一旦中途发现历史某个时点数据有问题,怎么办?这种情况,需要一天一天的把拉链表再重新跑出来。因为这个结构的复杂,你很难像切片表一样批量处理,只能顺序修复一下。

还有在使用中,如果你发现数据有异常,要排查问题的时候,这种结构初用其实也有些头疼。开始时间、结束时间大于号小于号写错,都会让数据搞错,所以,还得熟悉一下才能正常使用。虽然仔细看,其使用起来与切片表差异并不大。

SQL如下:

--切片表

select * from table_hisroty where ds ='${bizdate}';

--拉链表

select * from table_hisroty where '${bizdate}'>=start_date and '${bizdate}'<end_date;


五、结尾

关于拉链表使用的这内容就到这里了,个人还是建议明细层(基础层)存储较大的用户考虑一下这种结构。毕竟使用切片表存储的数据,冗余的还是挺多的。

以常见的T+1批量为例。切片表如果按日存储切片历史数据,一年365份的重复数据存储会让存储不堪重负。而如果采用常用的保留月末,其余时点删除的策略,其实一年只保留了12天的时点数据。如果使用拉链表,则可以保留一年365天的所有日切片时点数据,又只是占用了应该占用的存储,一点都没有浪费。

稍微增加一点点复杂,能节约这么多的空间,何乐而不为呢?为老板和客户省点钱,也是体现一下自己价值的方法。

image.png

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
4天前
|
存储 数据可视化 大数据
大数据管理与应用
大数据管理与应用是一门融合数学、统计学和计算机科学的新兴专业,涵盖数据采集、存储、处理、分析及应用,旨在帮助企业高效决策和提升竞争力。核心课程包括数据库原理、数据挖掘、大数据分析技术等,覆盖数据处理全流程。毕业生可从事数据分析、大数据开发、数据管理等岗位,广泛应用于企业、金融及互联网领域。随着数字化转型加速,该专业需求旺盛,前景广阔。
13 5
|
5天前
|
存储 搜索推荐 大数据
大数据在医疗领域的应用
大数据在医疗领域有广泛应用,包括电子病历的数字化管理和共享,提升医疗服务效率与协同性;通过数据分析支持医疗决策,制定个性化治疗方案;预测疾病风险并提供预防措施;在精准医疗中深度分析患者基因组信息,实现高效治疗;在药物研发中,加速疗效和副作用发现,提高临床试验效率。此外,在金融领域,大数据的“4V”特性助力业务决策前瞻性,被广泛应用于银行、证券和保险的风险评估、市场分析及个性化服务中,提升运营效率和客户满意度。
20 6
|
28天前
|
存储 大数据 数据挖掘
【数据新纪元】Apache Doris:重塑实时分析性能,解锁大数据处理新速度,引爆数据价值潜能!
【9月更文挑战第5天】Apache Doris以其卓越的性能、灵活的架构和高效的数据处理能力,正在重塑实时分析的性能极限,解锁大数据处理的新速度,引爆数据价值的无限潜能。在未来的发展中,我们有理由相信Apache Doris将继续引领数据处理的潮流,为企业提供更快速、更准确、更智能的数据洞察和决策支持。让我们携手并进,共同探索数据新纪元的无限可能!
78 11
|
1月前
|
机器学习/深度学习 数据可视化 大数据
阿里云大数据的应用示例
阿里云大数据应用平台为企业提供高效数据处理与业务洞察工具,涵盖Quick BI、DataV及PAI等核心产品。DT203课程通过实践教学,帮助学员掌握数据可视化、报表设计及机器学习分析技能,提升数据驱动决策能力。Quick BI简化复杂数据分析,DataV打造震撼可视化大屏,PAI支持全面的数据挖掘与算法应用。课程面向CSP、ISV及数据工程师等专业人士,为期两天,结合面授与实验,助力企业加速数字化转型。完成课程后,学员将熟练使用阿里云工具进行数据处理与分析。[了解更多](https://edu.aliyun.com/training/DT203)
|
6天前
|
机器学习/深度学习 人工智能 分布式计算
人工智能与大数据的融合应用##
随着科技的快速发展,人工智能(AI)和大数据技术已经深刻地改变了我们的生活。本文将探讨人工智能与大数据的基本概念、发展历程及其在多个领域的融合应用。同时,还将讨论这些技术所带来的优势与挑战,并展望未来的发展趋势。希望通过这篇文章,读者能够对人工智能与大数据有更深入的理解,并思考其对未来社会的影响。 ##
|
1月前
|
消息中间件 SQL 大数据
Hologres 在大数据实时处理中的应用
【9月更文第1天】随着大数据技术的发展,实时数据处理成为企业获取竞争优势的关键。传统的批处理框架虽然在处理大量历史数据时表现出色,但在应对实时数据流时却显得力不从心。阿里云的 Hologres 是一款全托管、实时的交互式分析服务,它不仅支持 SQL 查询,还能够与 Kafka、MaxCompute 等多种数据源无缝对接,非常适合于实时数据处理和分析。
75 2
|
2月前
|
存储 分布式计算 大数据
MaxCompute 数据分区与生命周期管理
【8月更文第31天】随着大数据分析需求的增长,如何高效地管理和组织数据变得至关重要。阿里云的 MaxCompute(原名 ODPS)是一个专为海量数据设计的计算服务,它提供了丰富的功能来帮助用户管理和优化数据。本文将重点讨论 MaxCompute 中的数据分区策略和生命周期管理方法,并通过具体的代码示例来展示如何实施这些策略。
81 1
|
2月前
数据平台问题之在数据影响决策的过程中,如何实现“决策/行动”阶段
数据平台问题之在数据影响决策的过程中,如何实现“决策/行动”阶段
|
2月前
|
分布式计算 大数据 数据处理
Apache Spark的应用与优势:解锁大数据处理的无限潜能
【8月更文挑战第23天】Apache Spark以其卓越的性能、易用性、通用性、弹性与可扩展性以及丰富的生态系统,在大数据处理领域展现出了强大的竞争力和广泛的应用前景。随着大数据技术的不断发展和普及,Spark必将成为企业实现数字化转型和业务创新的重要工具。未来,我们有理由相信,Spark将继续引领大数据处理技术的发展潮流,为企业创造更大的价值。
|
2月前
|
存储 监控 安全
大数据架构设计原则:构建高效、可扩展与安全的数据生态系统
【8月更文挑战第23天】大数据架构设计是一个复杂而系统的工程,需要综合考虑业务需求、技术选型、安全合规等多个方面。遵循上述设计原则,可以帮助企业构建出既高效又安全的大数据生态系统,为业务创新和决策支持提供强有力的支撑。随着技术的不断发展和业务需求的不断变化,持续优化和调整大数据架构也将成为一项持续的工作。

热门文章

最新文章

相关产品

  • 云原生大数据计算服务 MaxCompute
  • 下一篇
    无影云桌面