数据仓库(10)数仓拉链表开发实例

拉链表是数据仓库中特别重要的一种方式,它可以保留数据历史变化的过程,这里分享一下拉链表具体的开发过程。

维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录,通过拉链表可以很方便的还原出拉链时点的客户记录。

这里用商品价格的变化作为例子,具体的开发过程要按实际的来,不能照搬代码,编程重要的是了解背后的思路和原理,而不是ctrl+c和ctrl+v。那对我们学习提升的帮助有限,虽然可能对完成工作的效率帮助很大。

在开始介绍之前,这里的数据仓库的环境是HIVE。

首先看看原始的数据:

可以看到,原始的数据是每一个商品,一条记录,每一个商品,只保留最新的价格信息。这里的拉链表,我们做到天粒度的。

我们这里的思路是这样的,将最新的商品记录插入历史拉链表中,然后我们通过HIVE的窗口行数,按照end_date排序,然后分别取下一条的sale_price和end_date,然后再判断本条的价格和下一条的价格是否相等,如果是一样的,那么就把end_date改为下一条的end_date,最后做去重处理,然后就得到我们想要的数据了。

说了这么多,我觉得还是把sql贴出来会好一些,代码是最好的语言。

talk is cheap,show me the code。

-- 商品原始表这里取名goods_table
select spu_id,
       min(start_date) as start_date,
       end_date as end_date,
       sale_price
from
  (select spu_id,
          start_date,
          if(sale_price = lead_sale_price,lead_end_date,end_date) as end_date,
          sale_price
   from
     ( select spu_id,
              start_date,
              end_date,
              sale_price,
              lead(sale_price,1,null) over(partition by spu_id order by end_date) as lead_sale_price,
              lead(end_date) over(partition by spu_id order by end_date) as lead_end_date
      from goods_table ) t) t
group by spu_id,
         end_date,
         sale_price ;

根据上面的代码,跑出来的,就是我们想要的拉链表的数据了,看看最后的效果。

使用这种方式即可以记录历史,可以最大程度的节省存储,不会产生过多的冗余。

需要数据仓库资料可以点击这个领取数据仓库(13)大数据数仓经典最值得阅读书籍推荐

参考资料:

  1. 数据仓库(01)什么是数据仓库,数仓有什么特点
  2. 数据仓库(02)数仓、大数据与传统数据库的区别
  3. 数据仓库(03)数仓建模之星型模型与维度建模
  4. 数据仓库(04)基于维度建模的数仓KimBall架构
  5. 数据仓库(05)数仓Kimball与Inmon架构的对比
  6. 数据仓库(06)数仓分层设计
  7. 数据仓库(07)数仓规范设计
  8. 数据仓库(08)数仓事实表和维度表技术
  9. 数据仓库(09)数仓缓慢变化维度数据的处理
  10. 数据仓库(10)数仓拉链表开发实例
  11. 数据仓库(11)什么是大数据治理,数据治理的范围是哪些
  12. 数据仓库(12)数据治理之数仓数据管理实践心得
  13. 数据仓库(13)大数据数仓经典最值得阅读书籍推荐
本文转载于网络 如有侵权请联系删除

相关文章

  • 数据分析利器之归因分析

    导读:归因分析是用于确定如何将转化功劳分配给各转化路径,从而结合单次的转化成本对后续的投放策略进行优化,本次我们就来介绍一下归因分析的几种常用方法。1什么是归因分析?广义的归因分析指找到事情发展的原因,我们介绍过的公式法、漏洞模型等核心都是为了定位原因。我们日常在互联网广告行业中常说的归因分析特指渠道转化的贡献分析,如我们在四个渠道投放产品广告,通过归因分析判断哪个渠道转化效果最好,进而优化渠道投放策略。2几种常见的归因分析模型有一天三猫依次在a、b、c、d这4个不同的app上都看到了同一款防脱洗发水广告,并在最后看到的d这个app上点击详情页并下单购买,那如何判断每个渠道对三猫发生消费转化的贡献呢?末次归因模型 转化功劳为最后一次互动的渠道,即三猫的购买转化认为是通过d促成的。 优点:容易测量,不必担心业务周期长的场景可能会发生的数据损失,减少数据回溯处理成本。 弊端:三猫是因为看了a、b、c三个app的广告后不断加深印象,才在d看到后发生购买行为,因此其他三个渠道也为转化起到促进作用,而在这个模型中则无法统计进来,d渠道的功劳评估会被大幅高估。 适用场景:投放周期短、转化路径少、周

  • 图片识别,人脸识别,植物识别,花卉识别,签到小程序,借助百度AI智能识别功能实现图片识别,人脸识别小程序

    一,人脸签到效果图我们做人脸识别签到,其实就是要拿识别的人脸和数据库里的人脸对比,相识度大于一定的值,就可以判定成功。如我们识别的结果是98.295%,所以这里就可以认定为签到成功1-1,效果图1-1-1,还未签到1-1-2,签到1-1-3,签到成功二,准备工作2-1,注册百度开发者账号我们这里使用了百度的图片识别技术,所以在使用之前我们要现在注册百度开发者账号,官方地址:https://ai.baidu.com注册地址:https://login.bce.baidu.com至于如何注册,这里不需要我再教了吧,大家自行注册就行了。我们主要用到的是人脸识别技术2-2,注册完记得要实名下现在使用百度图片识别,必须要实名认证下。根据自己的情况选择认证方式学习的话,只需要个人认证即可。2-3,创建人脸识别应用我们这里主要使用的是百度的人脸对比功能,就是事先把要识别人的照片存到百度数据库,然后打卡时,让对应的人拍好照,和数据库里存的人脸图片进行对比,相似度达到一定数值,比如90%相似度,就可以认为识别成功,进行签到即可。在这里插入图片描述估计百度是在为后期收费做准备,但是目前还有免费资源可以领取

  • 几款实用小工具

    今天分享大家几款实用小工具,一款录制GIF动图,一款屏幕截图工具,一款屏幕截长图工具,一款网站前端代码下载工具,还有一款电脑自带的网站前端代码下载工具1、录制GIF动图软件下面两个是最近做的滑块验证码破解和翻译前端界面程序,我用GIF录屏软件进行录制,分别记录了电脑界面上的操作过程,有几个朋友问我怎么做的,今天分享给大家下面简单介绍下使用方式:就是这样一款软件,矩形框框,边框可以拉伸,控制录制的窗口大小,点击录制按钮先保存一个gif文件,在软件窗口内的操作,都可以实现录制我这里滚动窗口里面的文件,即可出现录制的文件滚动动画2、屏幕截图大家估计会问,现在微信QQ都能截图,并且Windows自带也有截图功能,还用我分享什么?当然,我分享给大家的,一定是我觉得有用的才会分享,有一些特色功能,比如下面这个截图工具的特色功能是什么,有什么方便之处,请看下面动图,截得的图片可以任意拖动当然,这个截图的图片,不仅能任意拖动,还能固定到窗口,这样就很方便了,如下图,如果我们需要键盘敲一些东西,内容在两个页面的话,我直接将截图固定到我当前页面,照着抄,可以减少页面之间来回切换的次数3、长图截取工具1,截

  • dapp泰山众筹开发,泰山众筹dapp系统开发技术详细

    去中心化应用,又称DApp(DecentrliazedApplication)在Web2.0的世界,我们的应用都是中心化的,不论是采用B/S架构还是C/S架构,数据的交互一般都是前端+后端,前端一般指的是面向用户页面,比如网页、移动端等,后端指的是提供数据以及逻辑处理业务端,数据的来源是严重依赖后端服务的,如果中心化的服务器宕机或后端代码有漏洞,则是相当危险的,大部分公司虽然会考虑到这一类的安全问题,通过各种手段避免事件的发生,但是无法从根源上避免,更别提有人故意写漏洞了。V+MrsFu123▲传统应用架构示例Web3.0则是“轻”后端“重”前端,指的是少调用或者不调用后端,前端直接与区块链交互,因为区块链拥有数据防篡改、多副本、接入方便(针对公有链)等优势,因此,可以防止出现因服务器宕机导致无法使用应用的情况。区块链业内有句话:只要给我一个前端,就可以干掉所有后端。话虽然极端,但意思已经表达很清楚了。▲DApp架构示例3)分布式存储如果有人说,Web3.0就是区块链,这种说法其实过于狭隘。区块链是Web3.0组成的一部分,还有其他的,比如存储。Web3.0强调的是去中心化,因此,数据

  • 利用Github Actions进行云编译lede固件

    教程类文章具有时效性,看清楚发布日期,超过一定日子文章内容可能失效,仅仅作为参考。2021年8月20日更新请前往阅读新文章,旧文章不做修改。https://elstec.cn/archives/20210821我想说的碍于国内的网络环境,本地编译出错概率极高,我本地编译出错好几次,于是便转向了Github云编译(这应该也算一种曲线救国hhhh)。由于Github本身就处在国外,编译出错的几率大大降低。不过GithubActions有免费额度,超出需要额外收费。https://github.com/features/actions需要准备的脑子耐心GitHub账号过程不过利用GithubActions进行云编译有多种方法,我就举两例。区别就是,一种需要更改openwrt-ci.yml文件达到自定义编译,另一种则是需要在编译开始过程中通过SSH连接GithubActions的服务器手动选择配置LuCI,就跟本地编译差不多。目录方法一:不需要SSH方法二:需要SSH下载编译好的包过程*两种方法均在有GitHub账号前提下进行操作,如果没有,请自行注册一个。*方法一首先打开大雕的仓库。http

  • CVE-2019-3398:Confluence 路径穿越

    0x00事件背景2019年4月17日Confluence官方发布安全公告,ConfluenceServer和DataCenter产品在downloadallattachments资源中存在一个路径穿越漏洞。有权向页面和(或)博客添加附件,或创建新空间或个人空间,或者对空间具有“管理员”权限的远程攻击者可以利用此漏洞将文件写入任意位置,最终导致远程代码执行。Confluence官方将此漏洞评价为严重级别,360CERT判断此漏洞影响范围广泛,建议广大用户及时更新ConfluenceServer或DataCenter,以免遭受黑客攻击。0x01影响范围影响产品:ConfluenceServerConfluenceDataCenter影响版本:6.6.14之前的所有版本所有6.7.x-6.11.x版本6.12.4之前的所有6.12.x版本6.13.4之前的所有6.13.x版本6.14.3之前的所有6.14.x版本6.15.2之前的所有6.15.x版本0x02修复建议升级ConfluenceServer或DataCenter版本:6.6.136.13.46.14.36.15.2执行官方缓解措施

  • 在两个半公有云上实现 Github Webhook

    背景ServiceMesher社区牵头启动Istio文档翻译工作之后,为降低维护工作量,我们开发了一个GithubWebhook项目,用GithubIssue的方式对社区翻译工作流程提供自动化支持。同时也开发了一个Chatbot来完成任务的维护工作。在上海KubeCon上,经过和Kubernetes文档工作组进行一番交流之后,决定将这一套方法推行到Kubernetes文档的本地化工作之中。经过一番准备之后,两个项目用相似的Flask代码,以在VPS上运行的DockerImage的形式支撑了两个本地化工作组的工作流程。然而两组代码始终是一个隐患,并且工作流程固化在代码之中,也给流程改进带来很大阻碍;另外使用高配Linode运行Webhook是个非常奢侈的事情。因此也就有了利用公有云FreeTier提供Webhook响应的想法。未解决这些问题,新建了Webhook项目,经过对代码的修改,将流程定制工作全部转移到配置文件之中,并将流程处理代码进行了固化,在此基础上,分别实现了Flask、AWSLambda以及GCPFunction的三个版本。AWSLambda入口代码Lambda版本的Web

  • 企业实施ERP频繁出错的因素有哪些?

    在信息比较零散的情况下如何及时获得信息,实现对公司的有效控制、及时决策,已是管理者首要面临的问题。随着企业经营规模的不断扩大,信息量越来越大,原有的手动信息处理流程,已无法及时传达信息,从而造成决策的失误。  此时,ERP管理软件通过计算机网络资源实现数据的集中处理和共享,迎合了企业管理的需求;虽然ERP是企业借用一种新的管理模式改造企业原有的旧的管理模式,是先进的,行之有效的管理思想和方法。但ERP系统实施过程中并不理想,其效果参差不齐并存在各式各样的问题。  对ERP系统的认识不足很多企业对ERP项目只视为计算机项目,对管理思想、管理软件、管理信息系统三个概念缺乏深刻的理解和认识。ERP是企业管理模式的全面创新,是一场深刻的管理革命,工作量大,涉及面广,实施周期长。是一项非常复杂的管理系统工程。但很多企业未能充分认识ERP项目是一个企业管理系统工程,而仅仅视其为企业信息化建设工程。以致实际应用中既没有立足于企业管理创新,也没有把应用ERP与深化改革、管理创新、应用现代企业管理思想和方法紧密结合起来。  缺乏ERP实施的复合型人才在ERP实施中所需要的既懂管理又懂计算机技术的人才缺乏

  • 浅析MongoDB中的意向锁

    01意向锁,解决的问题成熟的数据库设计中,需要一个模块对资源的并发控制进行管理。意向锁就是实现资源并发控制管理的经典方式。在讨论它的概念与设计前,我们先举几个MongoDB的经典场景。mongoDB默认是行级并发,我们希望多行并发读写互不影响,但是我们又希望对在dropCollection时,不能有任何对表的读写在操作,这个“不希望”也是双向的,即在对表并发读写时,我们也不希望dropCollection在操作。在执行dbStats命令时,希望和dropDB/insert命令互斥,但是又不影响对表的并发读。由于写每个db的每张表,都须要往oplog中写记录,因此oplog是全局的,我们希望在truncateoplog这个全局操作在进行时,任何db对oplog的写操作都被阻塞。 第一个例子中,我们似乎用传统的rwlock就可以解决,在对表进行并发读写前,加rlock,在对表进行dropCollection前,加wlock。暂不论rwlock的r状态和并发写的行为不一致,至少这样是行得通的。可是遇到了第二个例子,我们发现rwlock的rw两个状态无法表达我们的锁需求了,到了第三个例子,只

  • hdu------1281 棋盘游戏(最小覆盖点)

    棋盘游戏TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others) TotalSubmission(s):2492    AcceptedSubmission(s):1452 ProblemDescription小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只有某些格子才可以放,小希还是很轻松的解决了这个问题(见下图)注意不能放车的地方不影响车的互相攻击。 所以现在Gardon想让小希来解决一个更难的问题,在保证尽量多的“车”的前提下,棋盘里有些格子是可以避开的,也就是说,不在这些格子上放车,也可以保证尽量多的“车”被放下。但是某些格子若不放子,就无法保证放尽量多的“车”,这样的格子被称做重要点。Gardon想让小希算出有多少个这样的重要点,你能解决这个问题么? Input输入包含多组数据, 第一行有三个数N、M、K(1<N,M<=1001<K<=N*M),

  • 【MySQL系列】- Redo log知多少

    InnoDB存储引擎是以页为单位来管理存储空间的,我们的增删改查本质上都是对页面上进行操作。我们知道在访问磁盘的时候,MySQL是会把数据加载到BufferPool然后进行操作的。对于DML操作,表、索引等的增删改DDL操作,还有数据本身是在BufferPool缓冲池中可能还没来得及刷新到磁盘中,系统或者服务器突然崩溃,那这些数据该怎么恢复呢?redolog是什么上述问题就需要用到redolog了,那redolog又是什么呢?官网定义:❝Adisk-baseddatastructureusedduringcrashrecovery,tocorrectdatawrittenbyincompletetransactions ❞翻译过来就是,redolog是一种基于磁盘的数据结构,用于在故障恢复期间纠正由不完整事务写入的数据。redolog让MySQLinnodb引擎有崩溃自动恢复的能力。redolog是保证事务的完整性、持久性,只有innodb引擎支持事务,所以redolog也是innodb引擎独有的。redolog格式redolog本质上只是记录了一下事务对数据库做了哪些修改。InnoD

  • TensorFlow深度学习笔记 Tensorboard入门

    转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到Issue区讨论 官方教程: https://www.tensorflow.org/versions/master/how_tos/graph_viz/index.html 这份教程对应的代码有点过时了,请到我的GitHub获取最新的代码 TensorFlow自带的一个强大的可视化工具 功能 这是TensorFlow在MNIST实验数据上得到Tensorboard结果 Event:展示训练过程中的统计数据(最值,均值等)变化情况 Image:展示训练过程中记录的图像 Audio:展示训练过程中记录的音频 Histogram:展示训练过程中记录的数据的分布图 原理 在运行过程中,记录结构化的数据 运行一个本地服务器,监听6006端口 请求时,分析记录的数据,绘制 实现 在构建graph的过程中,记录你想要追踪的Tensor withtf.name_scope('output_act'): hidden=tf.nn.relu6(t

  • 设计原则:单一职责(SRP)原则

    1什么是单一职责(SRP)原则 单一职责原则的英文是SingleResponsibilityPrinciple,缩写为SRP。翻译过来就是:一个类或者模块只负责完成一个职责(或者功能)。 所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。 很多人认为这个原则是针对一个类进行描述,在我看来这里使用模块这个更加抽象的名词更为合适。在设计中,小到一个方法,大到一个模块我们都应该尽量取遵循单一职责原则。 2为什么要遵循单一职责 相信在我们日常开发中,每个人都遇到过改了一个问题经常会引起另一个问题。其原因大多都是因为在设计上违背了单一职责原则。 如果一个类承担的职责过多,就等于把这些职责耦合在一起了。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。而如果想要避免这种现象的发生,就要尽可能的遵守单一职责原则。此原则的核心就是解耦和增强内聚性,是为了实现代码高内聚、低耦合,提高代码的复用性、可读性、可维护性。。 如下图

  • css进阶

    本文转载自https://blog.csdn.net/xiaogeldx/article/details/85169861 练习: <!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <title>注册</title> <style> #div1{ width:350px; height:450px; border:1pxsolidred; margin:into; background:dimgray; } input{ width:330px; height:30px; border-radius:10px; margin-left:10px; margin-top:15px; } .a{ width:195px; height:30px; } .b{ width:120px; height:30px; } </style> </head> <

  • C# lamada find

    _LevelDiscountModelGvList.Find(a=>a.OilCode==l_Nozzle.OilNo);

  • VC编译cpp文件时的警告:warning LNK4017: // 语句不支持目标平台;已忽略

    首先必须明确的相信 warningLNK4017是属于def文件的警告信息,但为什么编译cpp文件也会报出该警告呢?一般来讲,这是一个误操作,可能是在新建项目时,选择的类型是def,但手动将后缀改为cpp,确定,这时候在“项目-配置-链接器-输入-模块定义文件中会有该cpp文件”,编译时一边当作cpp处理,链接时又当作def文件处理,所以出现了这些def文件不接受的无效字符串,最终输出警告。   如果你喜欢钻牛角尖的话,可以把这个误操作当作是IDE的一个BUG。。。。。。。。。。。

  • Spring生命周期源码分析文图

    历经半个月终于理清楚了SpringBean的脉络

  • js中快速获取数组中的最大值最小值

    vara=[1,2,3,5]; alert(Math.max.apply(null,a));//最大值 alert(Math.min.apply(null,a));//最小值复制 多维数组如下 vara=[1,2,3,[5,6],[1,4,8]]; varta=a.join(",").split(",");//转化为一维数组 alert(Math.max.apply(null,ta));//最大值 alert(Math.min.apply(null,ta));//最小值复制 或者用下面这种添加属性的方法 Array.prototype.max=function(){ returnMath.max.apply({},this) } Array.prototype.min=function(){ returnMath.min.apply({},this) } $(function(){ alert([1,2,3,4,5,11].max()); });复制 作者:石世特 出处:http://www.cnblogs.com/TivonStone/ 希望本文对你有所帮助,想转

  • Android Studio 相关

    AndroidStudio相关 1,searchEverywheredoubleShift 2,GotoFileCtrl+Shirft+N 3.RecentFilesCtrl+E 4.NavigationBarAlt+Home 5.DropfilesherefromExploer    6.ctrl+Alt+M  android Studio中抽取方法   按键说明 F1 帮助 Alt(Option)+F1 查找文件所在目录位置 Alt(Option)+1 快速打开或隐藏工程面板 Ctrl(Command)+Alt(Option)+ 打开设置对话框 Alt(Option)+Home 跳转到导航栏 Esc 光标返回编辑框 Shift+Esc 光标返回编辑框,关闭无用的窗口 Shift+Click 关闭标签页 F12 把焦点从编辑器移到最近使用的工具窗口 Ctrl(Command)+Alt(Option)+Y 同步 Ctrl(Command)+Alt(Option)+S

  • Promise初尝试

    promise.ts exportfunctionshowAlert(){ console.log("开始调用showAlert"); returnnewPromise((reslove,reject)=>{ try{ console.log("开始执行showAlert"); setTimeout(()=>{ console.log("执行showAlert完成"); reslove(); },3000); }catch(e){ reject(e); } }); } exportfunctionshowAlert2(){ console.log("开始调用2"); returnnewPromise((reslove,reject)=>{ try{ console.log("开始执行2"); setTimeout(()=>{ console.log("执行2完成"); reslove(); },5000); }catch(e){ reject(e); } }); } 复制 页面 import{showAlert,showAlert2}from"../prom

  • Android 开源库 GitHub 托管

    本文微信公众号「AndroidTraveler」首发。 背景 之前给大家写过一篇文章Android上传开源项目到jcenter实战踩坑之路,分享了上传开源项目到jcenter上面的一些踩坑经验。 最近,又有一个开源项目要上传,发现jcenter出现各种问题。 登录不上,登录后点击不断返回登录界面,或者404如下: 没办法,只能找找看有没有其他方式可以开源项目。 本文定位 本文主要讲解新方法的一些坑和经验,具体操作不赘述,如有不清楚的可以看参考链接。 1.准备好要开源的项目 假设你已经有了一个带Module的Android项目了。现在你想要将其开源出去。 首先将其上传到GitHub。 这里演示使用的项目地址是:AndroidModule 2.打开JitPack地址 点击右边链接打开:JitPack 如下图: 这个时候有两种方式可以获取远程代码仓库依赖。 第一种方式: 拷贝GitHub仓库到上图红框位置。 点击Lookup,再点击具体的TAB,比如Releases或者Builds,可以看到下图: 第二种方式: 点击网站的右上角使用GitHub进行授权登录。 登录后你的public仓库

相关推荐

推荐阅读