数据仓库之拉链表(二)使用拉链表更新数据

图解数据仓库之拉链表,超简单! 图解数据仓库之拉链表,超简单! 1.背景分析 2.图解拉链表形成过程 1)下图为业务后台数据库中每日的数据变化情况,每天只保留客户最新手机号码。 2)根据最后修改时间字段从业务后台数据库抽取最新被修改数据,形成分区表。 3.过程分析 4.评价 写在最后 ... 阅读详情

前提假设:

  • 数据仓库中订单历史表的刷新频率为一天,当天更新前一天的增量数据;

  • 如果一个订单在一天内有多次状态变化,则只会记录最后一个状态的历史;

  • 订单状态包括三个:创建、支付、完成

  • 创建时间和修改时间只取到天,如果原订单表中没有状态修改时间,那么抽取增量就比较麻烦,需要有个机制来确保能抽取到每天的增量数据;

  • 原系统中订单表结构为:
    CREATE TABLE orders (
    orderid INT,
    createtime STRING,
    modifiedtime STRING,
    status STRING
    ) stored AS textfile;

  • 在数据仓库的ODS层,有一张订单的增量数据表,按天分区,存放每天的增量数据:
    CREATE TABLE t_ods_orders_inc (
    orderid INT,
    createtime STRING,
    modifiedtime STRING,
    status STRING
    ) PARTITIONED BY (day STRING)
    stored AS textfile;

  • 在数据仓库的DW层,有一张订单的历史数据拉链表,存放订单的历史状态数据:
    CREATE TABLE t_dw_orders_his (
    orderid INT,
    createtime STRING,
    modifiedtime STRING,
    status STRING,
    dw_start_date STRING,
    dw_end_date STRING
    ) stored AS textfile;

  • 暂未考虑Hive上表的查询性能问题,只实现功能;

每天的原系统订单表的数据如下(红色标出的为当天发生变化的订单,即增量数据):
2015-08-21订单表数据:

订单编号订单创建时间订单修改时间订单状态
orderidcreatetimemodifiedtimestatus
12015-08-182015-08-18创建
22015-08-182015-08-18创建
32015-08-192015-08-21支付
42015-08-192015-08-21完成
52015-08-192015-08-20支付
62015-08-202015-08-20创建
72015-08-202015-08-21支付
82015-08-212015-08-21创建

2015-08-22订单表数据:

订单编号订单创建时间订单修改时间订单状态
orderidcreatetimemodifiedtimestatus
12015-08-182015-08-22支付
22015-08-182015-08-22完成
32015-08-192015-08-21支付
42015-08-192015-08-21完成
52015-08-192015-08-20支付
62015-08-202015-08-22支付
72015-08-202015-08-21支付
82015-08-212015-08-22支付
92015-08-222015-08-22创建
102015-08-222015-08-22支付

2015-08-23订单表数据:

订单编号订单创建时间订单修改时间订单状态
orderidcreatetimemodifiedtimestatus
12015-08-182015-08-23完成
22015-08-182015-08-22完成
32015-08-192015-08-23完成
42015-08-192015-08-21完成
52015-08-192015-08-23完成
62015-08-202015-08-22支付
72015-08-202015-08-21支付
82015-08-212015-08-23完成
92015-08-222015-08-22创建
102015-08-222015-08-22支付
112015-08-232015-08-23创建
122015-08-232015-08-23创建
132015-08-232015-08-23支付

全量初始化

在数据从原业务系统每天正常抽取和刷新到dw订单历史表之前,需要做一次全量的初始化,就是从原订单表中昨天以前的数据全部抽取到ods,并刷新到dw

以上面的数据为例,比如在2015-08-21这天做全量初始化,那么我需要将包括2015-08-20之前的所有的数据都抽取并刷新到dw:
第一步,抽取全量数据到ods

insert overwrite table t_ods_orders_inc partition(day=‘2015-08-20’) select orderid,createtime,modifiedtime,status from orders where createtime<=‘2015-08-20’;

第二步,从ods刷新到dw:
insert overwrite table t_dw_orders_his
select orderid,createtime,modifiedtime,status,createtime as dw_start_date,‘9999-12-31’ as dw_end_date from t_ods_orders_inc where day=‘2015-08-20’;

完成后,dw订单历史表中数据如下:

<span style="color:#000000"><code>spark-sql> select * from t_dw_orders_his;
1       2015-08-18      2015-08-18      创建    2015-08-18      9999-12-31      
2       2015-08-18      2015-08-18      创建    2015-08-18      9999-12-31
3       2015-08-19      2015-08-21      支付    2015-08-19      9999-12-31
4       2015-08-19      2015-08-21      完成    2015-08-19      9999-12-31
5       2015-08-19      2015-08-20      支付    2015-08-19      9999-12-31
6       2015-08-20      2015-08-20      创建    2015-08-20      9999-12-31
7       2015-08-20      2015-08-21      支付    2015-08-20      9999-12-31
</code></span>

增量抽取

每天,从原系统订单表中,将前一天的增量数据抽取到ods层的增量数据表中;这里的增量需要通过订单表中的创建时间和修改时间来确定:
insert overwrite table t_ods_orders_inc partition(day=’{day}’)
select orderid,createtime,modifiedtime,status from orders where createtime=’{day}’ or modifiedtime=’{day}’;

注意:在ods层按天分区的增量表,最好保留一段时间的数据,比如半年,为了防止某一天的数据有问题而回滚重做数据。

增量刷新历史数据

从2015-08-22开始,需要每天正常刷新前一天(2015-08–21)的增量数据到历史表

第一步,通过增量抽取,将2015-08-21的数据抽取到ods:

insert overwrite table t_ods_orders_inc partition(day=‘2015-08-21’)
select orderid,createtime,modifiedtime,status
from orders where createtime=‘2015-08-21’ or modifiedtime=‘2015-08-21’;

ods增量表中2015-08-21的数据如下:

<span style="color:#000000"><code>spark-sql> select * from t_ods_orders_inc where day = '2015-08-21';
3       2015-08-19      2015-08-21      支付    2015-08-21
4       2015-08-19      2015-08-21      完成    2015-08-21
7       2015-08-20      2015-08-21      支付    2015-08-21
8       2015-08-21      2015-08-21      创建    2015-08-21
</code></span>

第二步,通过dw历史数据(数据日期为2015-08-20)和ods增量数据(2015-08-21)刷新历史表:
先把数据放到一张临时表中:

<span style="color:#000000"><code>DROP TABLE IF EXISTS t_dw_orders_his_tmp;
CREATE TABLE t_dw_orders_his_tmp AS 
SELECT orderid,
createtime,
modifiedtime,
status,
dw_start_date,
dw_end_date 
FROM (
    SELECT a.orderid,
    a.createtime,
    a.modifiedtime,
    a.status,
    a.dw_start_date,
    CASE WHEN b.orderid IS NOT NULL AND a.dw_end_date > '2015-08-21' THEN '2015-08-20' ELSE a.dw_end_date END AS dw_end_date 
    FROM t_dw_orders_his a 
    left outer join (SELECT * FROM t_ods_orders_inc WHERE day = '2015-08-21') b 
    ON (a.orderid = b.orderid) 
    UNION
    SELECT orderid,
    createtime,
    modifiedtime,
    status,
    modifiedtime AS dw_start_date,
    '9999-12-31' AS dw_end_date 
    FROM t_ods_orders_inc 
    WHERE day = '2015-08-21' 
) x 
ORDER BY orderid,dw_start_date;
</code></span>

其中:
UNION ALL的两个结果集中,第一个是用历史表left outer join 日期为 {yyy-MM-dd} 的增量,能关联上的,并且dw_end_date > {yyy-MM-dd},说明状态有变化,则把原来的dw_end_date置为({yyy-MM-dd} – 1), 关联不上的,说明状态无变化,dw_end_date无变化。

第二个结果集是直接将增量数据插入历史表。

最后把临时表中数据插入历史表:
INSERT overwrite TABLE t_dw_orders_his
SELECT * FROM t_dw_orders_his_tmp;

刷新完后,历史表中数据如下:

<span style="color:#000000"><code>spark-sql> select * from t_dw_orders_his order by orderid,dw_start_date;
1       2015-08-18      2015-08-18      创建    2015-08-18      9999-12-31
2       2015-08-18      2015-08-18      创建    2015-08-18      9999-12-31
3       2015-08-19      2015-08-21      支付    2015-08-19      2015-08-20
3       2015-08-19      2015-08-21      支付    2015-08-21      9999-12-31
4       2015-08-19      2015-08-21      完成    2015-08-19      2015-08-20
4       2015-08-19      2015-08-21      完成    2015-08-21      9999-12-31
5       2015-08-19      2015-08-20      支付    2015-08-19      9999-12-31
6       2015-08-20      2015-08-20      创建    2015-08-20      9999-12-31
7       2015-08-20      2015-08-21      支付    2015-08-20      2015-08-20
7       2015-08-20      2015-08-21      支付    2015-08-21      9999-12-31
8       2015-08-21      2015-08-21      创建    2015-08-21      9999-12-31
</code></span>

由于在2015-08-21做了8月20日以前的数据全量初始化,而订单3,4,7在2015-08-21的增量数据中也存在,因此都有两条记录,但不影响后面的查询。

将2015-08-22的增量数据刷新到历史表

<span style="color:#000000"><code>INSERT overwrite TABLE t_ods_orders_inc PARTITION (day = '2015-08-22') 
SELECT orderid,createtime,modifiedtime,status 
FROM orders 
WHERE createtime = '2015-08-22' OR modifiedtime = '2015-08-22';
 
DROP TABLE IF EXISTS t_dw_orders_his_tmp;
CREATE TABLE t_dw_orders_his_tmp AS 
SELECT orderid,
createtime,
modifiedtime,
status,
dw_start_date,
dw_end_date 
FROM (
    SELECT a.orderid,
    a.createtime,
    a.modifiedtime,
    a.status,
    a.dw_start_date,
    CASE WHEN b.orderid IS NOT NULL AND a.dw_end_date > '2015-08-22' THEN '2015-08-21' ELSE a.dw_end_date END AS dw_end_date 
    FROM t_dw_orders_his a 
    left outer join (SELECT * FROM t_ods_orders_inc WHERE day = '2015-08-22') b 
    ON (a.orderid = b.orderid) 
    UNION ALL 
    SELECT orderid,
    createtime,
    modifiedtime,
    status,
    modifiedtime AS dw_start_date,
    '9999-12-31' AS dw_end_date 
    FROM t_ods_orders_inc 
    WHERE day = '2015-08-22' 
) x 
ORDER BY orderid,dw_start_date;
 
 
INSERT overwrite TABLE t_dw_orders_his 
SELECT * FROM t_dw_orders_his_tmp;
</code></span>

刷新完成后历史拉链表数据如下:

<span style="color:#000000"><code>spark-sql> select * from t_dw_orders_his order by orderid,dw_start_date;
1       2015-08-18      2015-08-18      创建    2015-08-18      2015-08-21
1       2015-08-18      2015-08-22      支付    2015-08-22      9999-12-31
2       2015-08-18      2015-08-18      创建    2015-08-18      2015-08-21
2       2015-08-18      2015-08-22      完成    2015-08-22      9999-12-31
3       2015-08-19      2015-08-21      支付    2015-08-19      2015-08-20
3       2015-08-19      2015-08-21      支付    2015-08-21      9999-12-31
4       2015-08-19      2015-08-21      完成    2015-08-19      2015-08-20
4       2015-08-19      2015-08-21      完成    2015-08-21      9999-12-31
5       2015-08-19      2015-08-20      支付    2015-08-19      9999-12-31
6       2015-08-20      2015-08-20      创建    2015-08-20      2015-08-21
6       2015-08-20      2015-08-22      支付    2015-08-22      9999-12-31
7       2015-08-20      2015-08-21      支付    2015-08-20      2015-08-20
7       2015-08-20      2015-08-21      支付    2015-08-21      9999-12-31
8       2015-08-21      2015-08-21      创建    2015-08-21      2015-08-21
8       2015-08-21      2015-08-22      支付    2015-08-22      9999-12-31
9       2015-08-22      2015-08-22      创建    2015-08-22      9999-12-31
10      2015-08-22      2015-08-22      支付    2015-08-22      9999-12-31
</code></span>

查看2015-08-21的历史快照数据:

<span style="color:#000000"><code>spark-sql> select * from t_dw_orders_his where dw_start_date <= '2015-08-21' and dw_end_date >= '2015-08-21';
1       2015-08-18      2015-08-18      创建    2015-08-18      2015-08-21
2       2015-08-18      2015-08-18      创建    2015-08-18      2015-08-21
3       2015-08-19      2015-08-21      支付    2015-08-21      9999-12-31
4       2015-08-19      2015-08-21      完成    2015-08-21      9999-12-31
5       2015-08-19      2015-08-20      支付    2015-08-19      9999-12-31
6       2015-08-20      2015-08-20      创建    2015-08-20      2015-08-21
7       2015-08-20      2015-08-21      支付    2015-08-21      9999-12-31
8       2015-08-21      2015-08-21      创建    2015-08-21      2015-08-21
</code></span>

订单1在2015-08-21的时候还处于创建的状态,在2015-08-22的时候状态变为支付。

再刷新2015-08-23的增量数据:

<span style="color:#000000"><code>spark-sql> select * from t_dw_orders_his order by orderid,dw_start_date;
1       2015-08-18      2015-08-18      创建    2015-08-18      2015-08-21
1       2015-08-18      2015-08-22      支付    2015-08-22      2015-08-22
1       2015-08-18      2015-08-23      完成    2015-08-23      9999-12-31
2       2015-08-18      2015-08-18      创建    2015-08-18      2015-08-21
2       2015-08-18      2015-08-22      完成    2015-08-22      9999-12-31
3       2015-08-19      2015-08-21      支付    2015-08-19      2015-08-20
3       2015-08-19      2015-08-21      支付    2015-08-21      2015-08-22
3       2015-08-19      2015-08-23      完成    2015-08-23      9999-12-31
4       2015-08-19      2015-08-21      完成    2015-08-19      2015-08-20
4       2015-08-19      2015-08-21      完成    2015-08-21      9999-12-31
5       2015-08-19      2015-08-20      支付    2015-08-19      2015-08-22
5       2015-08-19      2015-08-23      完成    2015-08-23      9999-12-31
6       2015-08-20      2015-08-20      创建    2015-08-20      2015-08-21
6       2015-08-20      2015-08-22      支付    2015-08-22      9999-12-31
7       2015-08-20      2015-08-21      支付    2015-08-20      2015-08-20
7       2015-08-20      2015-08-21      支付    2015-08-21      9999-12-31
8       2015-08-21      2015-08-21      创建    2015-08-21      2015-08-21
8       2015-08-21      2015-08-22      支付    2015-08-22      2015-08-22
8       2015-08-21      2015-08-23      完成    2015-08-23      9999-12-31
9       2015-08-22      2015-08-22      创建    2015-08-22      9999-12-31
10      2015-08-22      2015-08-22      支付    2015-08-22      9999-12-31
11      2015-08-23      2015-08-23      创建    2015-08-23      9999-12-31
12      2015-08-23      2015-08-23      创建    2015-08-23      9999-12-31
13      2015-08-23      2015-08-23      支付    2015-08-23      9999-12-31
</code></span>

订单1从20号-23号,状态变化了三次,历史表中有三条记录

<span style="color:#000000"><code>//查看2015-08-22当天的历史快照,可以看出,和上面图中2015-08-22时候订单表中的数据是一样的
spark-sql> select * from t_dw_orders_his where dw_start_date <= '2015-08-22' and dw_end_date >= '2015-08-22';
1       2015-08-18      2015-08-22      支付    2015-08-22      2015-08-22
2       2015-08-18      2015-08-22      完成    2015-08-22      9999-12-31
3       2015-08-19      2015-08-21      支付    2015-08-21      2015-08-22
4       2015-08-19      2015-08-21      完成    2015-08-21      9999-12-31
5       2015-08-19      2015-08-20      支付    2015-08-19      2015-08-22
6       2015-08-20      2015-08-22      支付    2015-08-22      9999-12-31
7       2015-08-20      2015-08-21      支付    2015-08-21      9999-12-31
8       2015-08-21      2015-08-22      支付    2015-08-22      2015-08-22
9       2015-08-22      2015-08-22      创建    2015-08-22      9999-12-31
10      2015-08-22      2015-08-22      支付    2015-08-22      9999-12-31
Time taken: 0.328 seconds, Fetched 10 row(s)
//查看当前所有订单的最新状态
spark-sql> select * from t_dw_orders_his where dw_end_date = '9999-12-31';                                   
1       2015-08-18      2015-08-23      完成    2015-08-23      9999-12-31
2       2015-08-18      2015-08-22      完成    2015-08-22      9999-12-31
3       2015-08-19      2015-08-23      完成    2015-08-23      9999-12-31
4       2015-08-19      2015-08-21      完成    2015-08-21      9999-12-31
5       2015-08-19      2015-08-23      完成    2015-08-23      9999-12-31
6       2015-08-20      2015-08-22      支付    2015-08-22      9999-12-31
7       2015-08-20      2015-08-21      支付    2015-08-21      9999-12-31
8       2015-08-21      2015-08-23      完成    2015-08-23      9999-12-31
9       2015-08-22      2015-08-22      创建    2015-08-22      9999-12-31
10      2015-08-22      2015-08-22      支付    2015-08-22      9999-12-31
11      2015-08-23      2015-08-23      创建    2015-08-23      9999-12-31
12      2015-08-23      2015-08-23      创建    2015-08-23      9999-12-31
13      2015-08-23      2015-08-23      支付    2015-08-23      9999-12-31</code></span>
Hive拉链表、快照表   拉链表记录一个事物从开始,一直到当前状态的所有变化的信息。可以使用这张表拿到最新的当天的最新数据以及之前的历史数据。 拉链表的使用场景 在数据仓库的数据模型设计过程中,经常会遇到下面这种表的设计: 有一些表的数据量很大,比如一张用户表,大约10亿条记录,50个字段,这种表即使使用ORC压缩,单张表的存储也会超过100G,在HDFS使用双备份或者三备份的话就更大一些 表中的部分字段会被update更新操作,如用户联系方式,产品的描述信息,订单的状态等等 需要查看某一个时间点或者时间段的历史快照信息,比 阅读详情

相关推荐

Greenplum拉链表的使用

greenplum拉链表的使用

水滴的博客 1821

如何在Hive中更新拉链表

拉链表有start_time和end_time字段用来记录每条数据的生命周期;用来记录历史数据,记录一个事物从开始一直到当前状态的所有变化的信息。使用union all 进行上下合并(union会去重);即只需要更新的数据处理,让数据过期;目的是将需要更新的数据置为过期;不等于‘9999-12-31’:包含新增和更新的数据。..................

机械工程跑路哥 2206

数据仓库-拉链表+增量表抽取的实现

背景: 业务部门提了用户分层的需求,其中有一点,业务放需要我们数仓提供历史数据,并且业务库里的部分表还没有数据更新时间字段。所以本篇文章主要解决两个问题 1:问题一 怎么再HIVE里实现拉链表 2:问题二 怎么再没有数据更新时间字段的情况下实现增量更新(个人认为这个方式也是一种通用的方式) 一:拉链表是什么?使用场景?实现原理? 1:是什么? 拉链表是一张记录事务历史变化的表,记录一个事务从开...

雨果等夏天的博客 2007

拉链表取某一天的历史快照

拉链表在数仓的应用十分普遍。它会在原始的表字段里面添加两个新的字段:create_time和end_time这两个。这两个字段的日期代表的是这条数据的开始时间和结束时间,也就是数据的生命周期。 我在开发的过程中会有这么一个问题,那就是我要取某一天的数据,有说法是create_time<=XXXX-XX-XX and end_time>=XXXX-XX-XX,也有说法说是:create_time<=XXXX-XX-XX and end_time>XXXX-XX-XX。区别在于end_t

weixin_43586713的博客 6856

SCD问题中的第三类实际应用

某一天的数据 start_dt<=to_Date('20200801','yyyyMMdd') and end_dt>to_Date('20200801','yyyyMMdd') 某段时间的数据 如8/01到8/30

someInNeed的博客 8403

数据仓库之【商品订单数据数仓】08:拉链表:什么是拉链表、创建拉链表

数据仓库之【商品订单数据数仓】08:拉链表:什么是拉链表、创建拉链表

weixin_40612128的博客 5029

全量拉链执行全过程,记录历史数据变化痕迹

数据仓库、ETL、拉链算法

yaoxiaofeng001的博客 2843

保姆级教程:用OpenCV的calibrateHandEye()搞定机器人手眼标定(附Python代码)

本文详细介绍了如何使用OpenCV的calibrateHandEye()函数完成机器人手眼标定,解决机械臂与相机坐标系对齐问题。教程涵盖从基础原理、数据采集到Python代码实现的完整流程,特别适合需要精确视觉引导的机器人应用开发。通过手眼标定,可确保机械臂准确抓取相机检测到的目标物体。

weixin_33712987的博客 517

数据同步核心问题与解决方案:增量全量、数据漂移,数据更新

摘要: 大数据时代下,数据同步面临增量与全量合并、性能优化及数据漂移三大核心问题。针对增量同步,采用增量合并全量策略,通过merge或全外连接实现高效更新;实时同步借助DSG/Canal等工具捕获日志变化,结合Kafka+Spark架构提升时效性。性能优化引入智能线程调度,基于元数据动态分配资源。数据漂移治理通过冗余时间范围或多时间戳校验(如modified_time、log_time)确保ODS层准确性,尤其在电商大促场景中需交叉验证业务时间。综合方案平衡效率与数据完整性,构建稳定同步体系。

. 1万+

SAP ERPsim生产拓展实验报告

ERP课的实验和实践,也是SAP竞赛玩的东西,除了界面不华丽外很像游戏而且是团队型的pvp大乱斗

m0_67262022的博客 2020

POVME3口袋体积计算:从.ini配置到实战解析

本文详细解析了POVME3口袋体积计算工具,从核心原理、环境准备到实战应用。重点剖析了控制计算行为的.ini配置文件,包括如何定义口袋区域、精修范围及锁定目标,并提供了固定坐标与配体引导两种实战策略,帮助研究人员从分子动力学轨迹中量化分析蛋白质结合口袋的动态变化。

weixin_29043895的博客 537

数据仓库之拉链表详解

转自:https://mp.weixin.qq.com/s/ixksVZNE-g1m6jr-LEF67w 什么是拉链表 记录历史数据,记录一个事物从开始一直到当前状态的所有变化的信息。 存储的是用户的最基本信息以及每条记录的生命周期。 拉链表的使用场景 数据仓库的数据模型设计过程中,经常会遇到如下这几种表的设计: 比如有一张用户表,数据量很大,50多个字段,大约10亿条记录,即使使用ORC压缩,单张表的存储也会超过100G,在hdfs中要是三副本存储那就会更大 表中的部分字段会被更新.

qq_654603797 1万+

Python+Tableau 全流程数据分析实战:从数据清洗到商业洞察可视化

本文通过Python+Tableau完整演示电商销售数据分析流程。首先使用Python进行数据清洗(缺失值处理、异常值过滤等)和探索性分析(商品类别、时间趋势等),然后导入Tableau创建交互式可视化仪表盘。分析发现电子产品销售额最高但利润率低,美妆类利润率最优,东部地区销售表现最好。最终提出优化供应链、加强美妆推广等商业建议,展示了Python数据处理与Tableau可视化的高效配合。所有代码可直接运行,适合数据分析初学者和从业者实战参考。

weixin_44520581的博客 337

数据仓库之拉链表

背景:在业务数据中存在会改变状态的数据,需要做历史分析,比如订单状态、登录位置等。 问题:如何找到历史某一天的所有主体的状态。 针对上述问题有三种解决方案: 每天保存全量数据快照:每天都做数据全量备份,可直接查询历史某个节点的全量数据。 每天只做增量数据抽取:查询的时候需要按用户分组并过滤更新时间最近的数据。 每天做增量数据且完成拉链:查询指定开始和结束时间即可。 上述三种方案的利弊...

bigdataprimary的博客 3138

from pointnet2_ops import pointnet2_utils 安装过程

pointnet2_ops

goodgoodstudy___的博客 8362

LLaMA-Factory微调教程5:多模态VLM模型对话

视觉-语言模型(VLM)概述与应用 视觉-语言模型(VLM)是一类结合视觉和语言信息的人工智能模型,旨在实现跨模态的理解与交互。其核心目标包括跨模态理解和生成能力,关键技术涉及模态表示与映射、多模态预训练以及跨模态交互机制。 典型VLM模型包括: CLIP:通过对比学习实现图像和文本的向量空间对齐 BLIP:结合自监督和弱监督学习提升语义对齐 ALBEF:基于BERT结构扩展跨模态注意力 DALL-E系列:基于文本生成图像的生成式模型 CLIP4Clip:扩展CLIP到视频领域 VLM在图像/视频检索、视觉

Cachel Wood的博客 1114

Hive数据仓库之全量表、增量表、快照表、切片表和拉链表

待整理实现! https://blog.youkuaiyun.com/mtj66/article/details/78019370?

weixin_43230682的博客 8368

零基础入门Simulink——基于Simulink的MIMO-OFDM系统仿真建模示例

MIMO概述MIMO技术利用多个天线进行信号发送和接收,通过空间复用来提高数据传输速率,或通过空间分集来增强信号的可靠性。OFDM概述OFDM是一种将高速率数据流分成多个低速数据流并行传输的技术,每个子载波都采用调制方式(如BPSK、QPSK),并通过IFFT/FFT变换实现串并转换。MIMO-OFDM优势结合了MIMO的空间分集增益与OFDM对抗多径效应的能力,适用于宽带无线通信系统。提供了更高的数据速率和更好的频谱效率,是现代无线通信标准(如4G LTE、5G NR等)的核心技术之一。

amy_mhd的博客 889

数据仓库拉链表

为了保证数仓拉链表能够正确地反映维度属性的历史变化情况,需要遵循以下几个设计原则:1. 每条记录都有一个起始时间:每条拉链记录都需要包含该维度属性值生效的开始时间和结束时间。3. 每个维度只有一个当前有效的记录:为了保证数仓拉链表能够正确地反映维度属性的当前有效值,需要保证每个维度只有一个当前有效的记录。通常情况下,每个维度记录都会对应一个或多个拉链记录,每个拉链记录包含了该维度在某个时间段内的所有属性值。在创建拉链表时,需要指定源数据和目标数据的连接信息,并设置好拉链表的主键、开始时间和结束时间等信息。

qq_22201881的博客 1943

《QGIS快速入门与应用基础》161:面要素顶点编辑与形状调整

本文系统讲解了QGIS中面要素顶点编辑与形状调整的核心操作。首先明确了顶点编辑的适用场景与核心概念,强调需满足图层类型、编辑模式、要素选择等六大前提。详细介绍了编辑顶点工具(F2键)的激活路径及配套辅助工具,通过耕地地块修正案例,分步骤演示顶点移动、添加(双击/工具栏)、删除(Delete键)三大基础操作。同时提供捕捉工具开启、画布缩放等实用技巧,帮助用户高效完成面要素的精细化调整,解决实际工作中的形状偏差问题。全文图文结合,步骤清晰,适合GIS新手快速掌握面要素编辑的核心技能。

LuckyHanMo的博客 486

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

漫谈数据仓库之拉链表使用场景、原理和在Hive中的实现示例

一、全量表-增量表-拉链表-流水表-介绍 1. 全量表:每天的所有的最新状态的数据, 2. 增量表:每天的新增数据,增量数据是上次导出之后的新数据。 3. 拉链表:维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录而已,通过拉链表可以很方便的还原出拉链时点的客户记录。 4. 流水表: 对于表的每一个修改都会记录,可以用于反映实际记录的变更。 拉链表和流水表的区别 流水表存放的是一个用户的变更记录,比如在一张流水表中,一天的.

helloxiaozhe的博客 4848

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数据仓库-拉链表

拉链表拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。我们先看一个示例,这就是一张拉链表,存储的是用户的最基本信息以及每条记录的生命周期。我们可以使用这张表拿到最新的当天的最新数据以及之前的历史数据。

wangqiaowq的博客 2149

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: linux下使用crontab创建定时作业
ACanswer
博客等级 码龄12年 280粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值