hive 中的拉链表 1

hive中拉链表

在有些情况下,为了保持历史的一些状态,需要用拉链表来做,这样做目的在可以保留所有状态的情况下可以节省空间。

拉链表适用于以下几种情况吧

数据量有点大,表中某些字段有变化,但是呢变化的频率也不是很高,业务需求呢又需要统计这种变化状态,每天全量一份呢,有点不太现实,

不仅浪费了存储空间,有时可能业务统计也有点麻烦,这时,拉链表的作用就提现出来了,既节省空间,又满足了需求。

一般在数仓中通过增加begin_date,en_date来表示,如下例,后两列是start_date和end_date.


1

2

3

4

5

6

7

8

9

10


1  2016-08-20  2016-08-20  创建 2016-08-20  2016-08-20

1  2016-08-20  2016-08-21  支付 2016-08-21  2016-08-21

1  2016-08-20  2016-08-22  完成 2016-08-22  9999-12-31

2  2016-08-20  2016-08-20  创建 2016-08-20  2016-08-20

2  2016-08-20  2016-08-21  完成 2016-08-21  9999-12-31

3  2016-08-20  2016-08-20  创建 2016-08-20  2016-08-21

3  2016-08-20  2016-08-22  支付 2016-08-22  9999-12-31

4  2016-08-21  2016-08-21  创建 2016-08-21  2016-08-21

4  2016-08-21  2016-08-22  支付 2016-08-22  9999-12-31

5  2016-08-22  2016-08-22  创建 2016-08-22  9999-12-31

begin_date表示该条记录的生命周期开始时间,end_date表示该条记录的生命周期结束时间;

end_date = ‘9999-12-31’表示该条记录目前处于有效状态;

如果查询当前所有有效的记录,则select * from order_his where dw_end_date = ‘9999-12-31′

如果查询2016-08-21的历史快照,则select * from order_his where begin_date <= ‘2016-08-21′ and end_date >= ‘2016-08-21’

再简单介绍一下拉链表的更新:

假设以天为维度,以每天的最后一个状态为当天的最终状态。

以一张订单表为例,如下是原始数据,每天的订单状态明细


1

2

3

4

5

6

7

8

9

10


1   2016-08-20  2016-08-20  创建

2   2016-08-20  2016-08-20  创建

3   2016-08-20  2016-08-20  创建

1   2016-08-20  2016-08-21  支付

2   2016-08-20  2016-08-21  完成

4   2016-08-21  2016-08-21  创建

1   2016-08-20  2016-08-22  完成

3   2016-08-20  2016-08-22  支付

4   2016-08-21  2016-08-22  支付

5   2016-08-22  2016-08-22  创建

根据拉链表我们希望得到的是


1

2

3

4

5

6

7

8

9

10


1  2016-08-20  2016-08-20  创建 2016-08-20  2016-08-20

1  2016-08-20  2016-08-21  支付 2016-08-21  2016-08-21

1  2016-08-20  2016-08-22  完成 2016-08-22  9999-12-31

2  2016-08-20  2016-08-20  创建 2016-08-20  2016-08-20

2  2016-08-20  2016-08-21  完成 2016-08-21  9999-12-31

3  2016-08-20  2016-08-20  创建 2016-08-20  2016-08-21

3  2016-08-20  2016-08-22  支付 2016-08-22  9999-12-31

4  2016-08-21  2016-08-21  创建 2016-08-21  2016-08-21

4  2016-08-21  2016-08-22  支付 2016-08-22  9999-12-31

5  2016-08-22  2016-08-22  创建 2016-08-22  9999-12-31

可以看出 1,2,3,4每个订单的状态都有,并且也能统计到当前的有效状态。

时间: 2024-12-28 11:59:04

hive 中的拉链表 1的相关文章

基于hive的拉链表设计实现

参考http://lxw1234.com/archives/2015/08/473.htm 测试数据 order_2015-08-21 1 2015-08-18 2015-08-18 创建2 2015-08-18 2015-08-18 创建3 2015-08-19 2015-08-21 支付4 2015-08-19 2015-08-21 完成5 2015-08-19 2015-08-20 支付6 2015-08-20 2015-08-20 创建7 2015-08-20 2015-08-21 支付

Hive拉链表实现

拉链表测试: 有如下测试数据 --2019/12/1号订单的全量数据 id status create_time operation_time 1 待支付 2019-12-01 2 待支付 2019-12-01 3 已支付 2019-12-01 --2019/12/2号订单的全量数据 id status create_time operation_time 1 待支付 2019-12-01 2 已支付 2019-12-01 2019-12-02 3 已支付 2019-12-01 4 待支付 20

拉链表流水表

1. 全量表:每天的所有的最新状态的数据, 2. 增量表:每天的新增数据,增量数据是上次导出之后的新数据. 3. 拉链表:维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录而已,通过拉链表可以很方便的还原出拉链时点的客户记录. 4. 流水表: 对于表的每一个修改都会记录,可以用于反映实际记录的变更. 拉链表通常是对账户信息的历史变动进行处理保留的结果,流水表是每天的交易形成的历史: 流水表用于统计业务相关情况,拉链表用于统计

数仓1.4 |业务数仓搭建| 拉链表| Presto

电商业务及数据结构 SKU库存量,剩余多少SPU商品聚集的最小单位,,,这类商品的抽象,提取公共的内容 订单表:周期性状态变化(order_info) id 订单编号 total_amount 订单金额 order_status 订单状态 user_id 用户id payment_way 支付方式 out_trade_no 支付流水号 create_time 创建时间 operate_time 操作时间 订单详情表:(order_detail) order_detail.order_id 是要一

使用kettle制作拉链表

拉链表是在数据仓库中常见的表,主要用还存储不按时间变化的表,比如客户基本信息表. 下面先建两个实例表,user_info和user_info_l,其中user_info_l为拉链表. user_info表及数据: user_info_l表及转换后的数据: kettle的设计其实很简单,就一个“表输入”一个“维度查询/更新 下面来看一下表输入的配置: 这个很简单,但是一定要有个基本表的数据日期 下面几个是“维度查询/更新”的配置: 下面介绍一下设置中的关键地方,依次如下: 1.不钩选的话变化的数据

拉链表

拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史.记录一个事物从开始,一直到当前状态的所有变化的信息. 优点:为了节省数据库的空间 用处:记录一个事物从开始到现在所有的状态信息. 1采集原系统的全量数据到表new1. 2从历史表中获取昨日全量数据到表new2. 3从new1和new2中比较出新增和改变的数据,也就是增量数据到表new3. 4从new1和new2中比较出来改变的数据,到表new4. 5将new3的数据插入到历史表中,这些是新增记录,startda

极限存储--历史拉链表(上)

在数据仓库的数据模型设计过程中,经常会遇到这样的需求: 1. 数据量比较大;2. 表中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态等等;3. 需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态,   比如,查看某一个用户在过去某一段时间内,更新过几次等等;4. 变化的比例和频率不是很大,比如,总共有1000万的会员,每天新增和发生变化的有10万左右;5. 如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极

hive中order by,sort by, distribute by, cluster by作用以及用法

1. order by Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的数据都会到同一个reducer进行处理(不管有多少map,也不管文件有多少的block只会启动一个reducer).但是对于大量数据这将会消耗很长的时间去执行. 这里跟传统的sql还有一点区别:如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来

kettle连接Hive中数据导入导出(6)

1.hive往外写数据 http://wiki.pentaho.com/display/BAD/Extracting+Data+from+Hive+to+Load+an+RDBMS 连接hive 表输入 1)往excel中写数据 2)往文本文件中写数据 注:这里需要填上hive的表名.字段名,不然会报如下错误: 2016/07/27 15:43:01 - 表输入.0 - ERROR (version 3.2.0, build 1 from 2016-07-07 10.46.10 by xnren