Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >维度模型数据仓库(十八) —— 迟到的事实

维度模型数据仓库(十八) —— 迟到的事实

作者头像
用户1148526
发布于 2022-06-14 04:41:14
发布于 2022-06-14 04:41:14
31400
代码可运行
举报
文章被收录于专栏:Hadoop数据仓库Hadoop数据仓库
运行总次数:0
代码可运行

(五)进阶技术         13. 迟到的事实         装载日期在生效日期后的事实就是迟到的事实。晚于订单日期进入源数据的销售订单可以看做是一个迟到事实的例子。销售订单被装载进其事实表时,装载的日期晚于销售订单的订单日期,因此是一个迟到的事实。(因为定期装载的是前一天的数据,所以这里的晚于指的是晚2天及其以上。)         迟到事实影响周期快照事实表的装载,如(五)进阶技术5. “快照”中讨论的month_end_sales_order_fact表。比方说,2015年3月的销售订单金额月底快照已经计算并存储在month_end_sales_order_fact表中,这时一个迟到的订单在3月10日被装载,那么2015年3月的快照金额必须因迟到事实而重新计算。         处理迟到事实         本节说明当导入month_end_sales_order_fact表时如何处理迟到的销售订单。    为了知道一个销售订单是否是迟到的,需要把销售订单数据源的登记日期装载进sales_order_fact表。由于现在还没有登记日期列,你需要在事实表上添加此列。使用维度角色扮演技术添加登记日期。因此,在销售订单事实表里添加名为entry_date_sk的日期代理键列,并且从日期维度表创建一个叫做entry_date_dim的数据库视图。清单(五)-13-1里的脚本创建entry_date_dim视图和销售订单事实表里的entry_date_sk代理键列。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
USE dw;
CREATE VIEW entry_date_dim (entry_date_sk , entry_date , month_name , month , quarter , year , promo_ind , effective_date , expiry_date) AS
    SELECT 
        date_sk,
        date,
        month_name,
        month,
        quarter,
        year,
        promo_ind,
        effective_date,
        expiry_date
    FROM
        date_dim;

ALTER TABLE sales_order_fact ADD entry_date_sk INT AFTER receive_date_sk;
ALTER TABLE sales_order_fact ADD CONSTRAINT FOREIGN KEY (entry_date_sk) REFERENCES date_dim(date_sk);

清单(五)-13-1

        创建完entry_date_dim视图,并给sales_order_fact表添加了entry_date_sk列以后,需要修改数据仓库定期装载脚本来包含登记日期。清单(五)-13-2显示了修改后的定期装载脚本。注意sales_order数据源已经含有登记日期,只是以前没有将其装载进数据仓库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
USE dw;

-- 设置SCD的截止时间和生效时间
SET @pre_date = SUBDATE(CURRENT_DATE,1) ;

-- 设置CDC的上限时间
UPDATE cdc_time SET current_load = CURRENT_DATE ;

-- 装载客户维度
TRUNCATE TABLE customer_stg;
INSERT INTO customer_stg
SELECT 
  customer_number
, customer_name
, customer_street_address
, customer_zip_code
, customer_city
, customer_state
, shipping_address
, shipping_zip_code
, shipping_city
, shipping_state
FROM source.customer ;
/* 在所有地址列上 SCD2                           */
/* 置过期                          */
UPDATE customer_dim a,
    customer_stg b 
SET 
    expiry_date = @pre_date
WHERE
    a.customer_number = b.customer_number
        AND (a.customer_street_address <> b.customer_street_address
        OR a.customer_city <> b.customer_city
        OR a.customer_zip_code <> b.customer_zip_code
        OR a.customer_state <> b.customer_state
        OR a.shipping_address <> b.shipping_address
        OR a.shipping_city <> b.shipping_city
        OR a.shipping_zip_code <> b.shipping_zip_code
        OR a.shipping_state <> b.shipping_state
        OR a.shipping_address IS NULL
        OR a.shipping_city IS NULL
        OR a.shipping_zip_code IS NULL
        OR a.shipping_state IS NULL)
        AND expiry_date = '2200-01-01';
/* 加新行                          */
INSERT INTO customer_dim
SELECT
  NULL
, b.customer_number
, b.customer_name
, b.customer_street_address
, b.customer_zip_code
, b.customer_city
, b.customer_state
, b.shipping_address
, b.shipping_zip_code
, b.shipping_city
, b.shipping_state
, a.version + 1
, @pre_date
, '2200-01-01'
FROM
  customer_dim a
, customer_stg b
WHERE
    a.customer_number = b.customer_number
AND ( a.customer_street_address <> b.customer_street_address
     OR a.customer_city <> b.customer_city
     OR a.customer_zip_code <> b.customer_zip_code
     OR a.customer_state <> b.customer_state
     OR a.shipping_address <> b.shipping_address
     OR a.shipping_city <> b.shipping_city
     OR a.shipping_zip_code <> b.shipping_zip_code
     OR a.shipping_state <> b.shipping_state
     OR a.shipping_address IS NULL
     OR a.shipping_city IS NULL
     OR a.shipping_zip_code IS NULL
     OR a.shipping_state IS NULL)
AND EXISTS(
SELECT *
FROM customer_dim x
WHERE
    b.customer_number=x.customer_number
AND a.expiry_date = @pre_date )
AND NOT EXISTS (
SELECT *
FROM customer_dim y
WHERE
    b.customer_number = y.customer_number
AND y.expiry_date = '2200-01-01') ;
/* 在 customer_name 列上 SCD1                                             */
UPDATE customer_dim a, customer_stg b
SET a.customer_name = b.customer_name
WHERE a.customer_number = b.customer_number
      AND a.customer_name <> b.customer_name ;
/* 新增的客户                                                   */
INSERT INTO customer_dim
SELECT
  NULL
, customer_number
, customer_name
, customer_street_address
, customer_zip_code
, customer_city
, customer_state
, shipping_address
, shipping_zip_code
, shipping_city
, shipping_state
, 1
, @pre_date
,'2200-01-01'
FROM customer_stg
WHERE customer_number NOT IN(
SELECT y.customer_number
FROM customer_dim x, customer_stg y
WHERE x.customer_number = y.customer_number) ;

/* 重建PA客户维度                               */
TRUNCATE pa_customer_dim;
INSERT INTO pa_customer_dim
SELECT
  customer_sk
, customer_number
, customer_name
, customer_street_address
, customer_zip_code
, customer_city
, customer_state
, shipping_address
, shipping_zip_code
, shipping_city
, shipping_state
, version
, effective_date
, expiry_date
FROM customer_dim
WHERE customer_state = 'PA' ;

/* 装载产品维度                                           */
TRUNCATE TABLE product_stg ;
INSERT INTO product_stg
SELECT 
  product_code
, product_name
, product_category
FROM source.product ;
/* 在 product_name 和 product_category 列上 SCD2                                    */
/* 置过期                                 */
UPDATE
  product_dim a
, product_stg b
SET
  expiry_date = @pre_date
WHERE
    a.product_code = b.product_code
AND (   a.product_name <> b.product_name
     OR a.product_category <> b.product_category)
AND expiry_date = '2200-01-01';
/* 加新行                                */
INSERT INTO product_dim
SELECT
  NULL
, b.product_code
, b.product_name
, b.product_category
, a.version + 1
, @pre_date
,'2200-01-01'
FROM
  product_dim a
, product_stg b
WHERE
    a.product_code = b.product_code
AND (   a.product_name <> b.product_name
     OR a.product_category <> b.product_category)
AND EXISTS(
SELECT *
FROM product_dim x
WHERE     b.product_code = x.product_code
      AND a.expiry_date = @pre_date)
AND NOT EXISTS (
SELECT *
FROM product_dim y
WHERE     b.product_code = y.product_code
      AND y.expiry_date = '2200-01-01') ;
/* 新增的产品                                                    */
INSERT INTO product_dim
SELECT
  NULL
, product_code
, product_name
, product_category
, 1
, @pre_date
, '2200-01-01'
FROM product_stg
WHERE product_code NOT IN(
SELECT y.product_code
FROM product_dim x, product_stg y
WHERE x.product_code = y.product_code) ;

/* PRODUCT_COUNT_FACT POPULATION                                       */
TRUNCATE product_count_fact;

INSERT INTO product_count_fact(product_sk, product_launch_date_sk)
SELECT
  a.product_sk
, b.date_sk
FROM
  product_dim a
, date_dim b
WHERE
a.effective_date = b.date
GROUP BY product_code;
/* END OF PRODUCT_COUNT_FACT POPULATION                                */

-- 装载事实表,新增前一天的订单
INSERT INTO sales_order_fact
SELECT
  customer_sk
, product_sk
, g.sales_order_attribute_sk
, e.order_date_sk
, NULL
, NULL
, NULL
, NULL
, h.entry_date_sk
, a.order_number
, f.request_delivery_date_sk
, order_amount
, quantity
, NULL
, NULL
, NULL
, NULL
FROM
  source.sales_order a
, customer_dim c
, product_dim d
, order_date_dim e
, request_delivery_date_dim f
, sales_order_attribute_dim g
, entry_date_dim h
, cdc_time i
WHERE
	a.order_status = 'N'
AND a.customer_number = c.customer_number
AND a.status_date >= c.effective_date
AND a.status_date < c.expiry_date
AND a.product_code = d.product_code
AND a.status_date >= d.effective_date
AND a.status_date < d.expiry_date
AND a.status_date = e.order_date
AND a.entry_date = h.entry_date
AND a.request_delivery_date = f.request_delivery_date
AND a.verification_ind = g.verification_ind
AND a.credit_check_flag = g.credit_check_flag
AND a.new_customer_ind = g.new_customer_ind
AND a.web_order_flag = g.web_order_flag
AND a.entry_date >= i.last_load AND a.entry_date < i.current_load ;

/* UPDATING the new sales order to Allocated status           */
UPDATE sales_order_fact a,
    source.sales_order b,
    allocate_date_dim c,
    cdc_time h
SET 
    a.allocate_date_sk = c.allocate_date_sk,
    a.allocate_quantity = b.quantity
WHERE
    order_status = 'A'
        AND b.entry_date >= h.last_load AND b.entry_date < h.current_load
        AND b.order_number = a.order_number
        AND c.allocate_date = b.status_date ;

/* UPDATING the allocated order to Packed status              */
UPDATE sales_order_fact a,
    source.sales_order b,
    packing_date_dim d,
    cdc_time h
SET 
    a.packing_date_sk = d.packing_date_sk,
    a.packing_quantity = b.quantity
WHERE
    order_status = 'P'
        AND b.entry_date >= h.last_load AND b.entry_date < h.current_load
        AND b.order_number = a.order_number
        AND d.packing_date = b.status_date ;

/* UPDATING the packed order to Shipped status                */
UPDATE sales_order_fact a,
    source.sales_order b,
    ship_date_dim e,
    cdc_time h
SET 
    a.ship_date_sk = e.ship_date_sk,
    a.ship_quantity = b.quantity
WHERE
    order_status = 'S'
        AND b.entry_date >= h.last_load AND b.entry_date < h.current_load
        AND b.order_number = a.order_number
        AND e.ship_date = b.status_date ;

/* UPDATING the shipped order to Received status              */
UPDATE sales_order_fact a,
    source.sales_order b,
    receive_date_dim f,
    cdc_time h
SET 
    a.receive_date_sk = f.receive_date_sk,
    a.receive_quantity = b.quantity
WHERE
    order_status = 'R'
        AND b.entry_date >= h.last_load AND b.entry_date < h.current_load
        AND b.order_number = a.order_number
        AND f.receive_date = b.status_date ;

-- 更新时间戳表的last_load字段
UPDATE cdc_time SET last_load = current_load ;

COMMIT ;

清单(五)-13-2

        图(五)- 13-1、图(五)- 13-3显示了对Kettle定期装载销售订单事实表做的修改:只是在转换中增加了一个“获取登记日期代理键”的步骤,并对装载事实表进行了相应的修改。

图(五)- 13-1

图(五)- 13-2

图(五)- 13-3

        最后还要修改装载月底销售订单事实表脚本。清单(五)-13-3里显示了修改后的脚本,它有两部分。第一部分处理没迟到的并且月底订单事实表中不存在销售订单或新增的非迟到的销售订单。第二部分在具有相同产品和月份的现有销售订单行上增加新增的销售金额。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
USE dw;

SET @pre_date = SUBDATE(CURRENT_DATE,1) ;

/* late arrival, amount & quantity already exist for the past months*/
UPDATE month_end_sales_order_fact a,
    (SELECT 
        d.month_sk month_sk,
            a.product_sk product_sk,
            SUM(order_amount) order_amount,
            SUM(order_quantity) order_quantity
    FROM
        sales_order_fact a, order_date_dim b, entry_date_dim c, month_dim d
    WHERE
        a.order_date_sk = b.order_date_sk
            AND a.entry_date_sk = c.entry_date_sk
            AND c.month = MONTH(@pre_date)
            AND c.year = YEAR(@pre_date)
            AND b.month = d.month
            AND b.year = d.year
            AND b.order_date <> c.entry_date
    GROUP BY d.month_sk , a.product_sk) b 
SET 
    month_order_amount = month_order_amount + b.order_amount,
    month_order_quantity = month_order_quantity + b.order_quantity
where
    a.product_sk = b.product_sk
        and a.order_month_sk = b.month_sk;

INSERT INTO month_end_sales_order_fact
/* normal (order_date = entry_date)                                   */
SELECT 
    d.month_sk,
    a.product_sk,
    SUM(order_amount),
    SUM(order_quantity)
FROM
    sales_order_fact a,
    order_date_dim b,
    entry_date_dim c,
    month_dim d
WHERE
    a.order_date_sk = b.order_date_sk
        AND a.entry_date_sk = c.entry_date_sk
        AND c.month = MONTH(@pre_date)
        AND c.year = YEAR(@pre_date)
        AND b.month = d.month
        AND b.year = d.year
        AND b.order_date = c.entry_date
GROUP BY d.month_sk , a.product_sk 
union all 
/* late arrival but amount & quantity not exist for the past months*/
SELECT 
    d.month_sk,
    a.product_sk,
    SUM(order_amount),
    SUM(order_quantity)
FROM
    sales_order_fact a,
    order_date_dim b,
    entry_date_dim c,
    month_dim d
WHERE
    a.order_date_sk = b.order_date_sk
        AND a.entry_date_sk = c.entry_date_sk
        AND b.order_date <> c.entry_date
        AND c.month = MONTH(@pre_date)
        AND c.year = YEAR(@pre_date)
        AND b.month = d.month
        AND b.year = d.year
        AND NOT EXISTS( SELECT 
            1
        FROM
            month_end_sales_order_fact p,
            month_dim s
        WHERE
            p.order_month_sk = s.month_sk
                AND s.month = d.month
                AND s.year = d.year
                AND p.product_sk = a.product_sk)
GROUP BY d.month_sk , a.product_sk;

COMMIT ;

清单(五)-13-3

        图(五)- 13-4、图(五)- 13-18显示了使用Kettle转换定期装载月底销售订单事实表的相关步骤。

图(五)- 13-4

图(五)- 13-5

图(五)- 13-6

图(五)- 13-7

图(五)- 13-8

图(五)- 13-9

图(五)- 13-10

图(五)- 13-11

图(五)- 13-12

图(五)- 13-13

图(五)- 13-14

图(五)- 13-15

图(五)- 13-16

图(五)- 13-17

图(五)- 13-18

        测试         本节说明在执行清单(五)-13-2和清单(五)-13-3里的脚本前必须的准备步骤。         第一步是执行下面的SQL语句装载销售订单的登记日期。此SQL语句把销售订单的entry_date_sk修改为order_date_sk值。这些登记日期是后面测试三月月底快照导入所需要的。 UPDATE sales_order_fact SET entry_date_sk = order_date_sk;         可以在执行定期装载脚本前查询month_end_sales_order_fact表。之后可以对比‘前’(不包含迟到事实)‘后’(包含了迟到事实)的数据,以确认装载的正确性。可以查询month_end_sales_order_fact表,查询语句和结果如下所示。 mysql> select     ->     year,     ->     month,     ->     product_name,     ->     month_order_amount amt,     ->     month_order_quantity qty     -> from     ->     month_end_sales_order_fact a,     ->     month_dim b,     ->     product_dim c     -> where     ->     a.order_month_sk = b.month_sk     ->         and a.product_sk = c.product_sk     -> order by year , month , product_name; +------+-------+-----------------+---------+------+ | year | month | product_name    | amt     | qty  | +------+-------+-----------------+---------+------+ | 2014 |     1 | LCD Panel       | 1000.00 | NULL | | 2014 |     2 | Hard Disk Drive | 1000.00 | NULL | | 2014 |     3 | Floppy Drive    | 2000.00 | NULL | | 2014 |     4 | LCD Panel       | 2500.00 | NULL | | 2014 |     5 | Hard Disk Drive | 3000.00 | NULL | | 2014 |     6 | Floppy Drive    | 3500.00 | NULL | | 2014 |     7 | LCD Panel       | 4000.00 | NULL | | 2014 |     8 | Hard Disk Drive | 4500.00 | NULL | | 2014 |     9 | Floppy Drive    | 1000.00 | NULL | | 2014 |    10 | LCD Panel       | 1000.00 | NULL | | 2015 |     2 | Floppy Drive    | 4000.00 | NULL | | 2015 |     2 | LCD Panel       | 4000.00 | NULL | +------+-------+-----------------+---------+------+ 12 rows in set (0.00 sec)         为了对比‘前’‘后’日期,查询sales_order_fact表,查询语句和结果如下所示。 mysql> SELECT     ->     product_name, SUM(order_amount)     -> FROM     ->     sales_order_fact a,     ->     product_dim b     -> WHERE     ->     order_date_sk > 5538     ->         AND a.product_sk = b.product_sk     -> GROUP BY a.product_sk     -> ORDER BY product_name; +-----------------+-------------------+ | product_name    | SUM(order_amount) | +-----------------+-------------------+ | Flat Panel      |          47000.00 | | Floppy Drive    |          25000.00 | | Hard Disk Drive |          46500.00 | | Keyboard        |          27000.00 | +-----------------+-------------------+ 4 rows in set (0.00 sec)         下一步执行清单(五)-13-4里的脚本准备销售订单测试数据。此脚本将三个销售订单装载进销售订单源数据,一个是迟到的在month_end_sales_order_fact中已存在的产品,一个是迟到的在month_end_sales_order_fact中不存在的产品,另一个是非迟到的正常产品。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
USE source;
INSERT INTO sales_order VALUES
/* late arrival                                                       */
  (62, 6, 2, 'Y', 'Y', 'Y', 'N', '2015-02-25', 'N', '2015-03-30',
       '2015-03-26', 1000, 10)
, (63, 6, 1, 'Y', 'Y', 'Y', 'N', '2015-02-26', 'N', '2015-03-30',
       '2015-03-26', 1000, 10)
/* normal                                                             */
, (64, 12, 5, 'Y', 'N', 'Y', 'N', '2015-03-26', 'N', '2015-03-30',
       '2015-03-26', 2000, 20)
;

COMMIT;

清单(五)-13-4

        在执行新的月底销售订单定期装载脚本前,必须先把两条新的销售订装载进sales_order_fact表。设置系统日期为2015年3月27日,也就是销售订单测试数据的登记日期的后一天,然后执行清单(五)-13-2里的脚本。         现在已经准备好运行修改后的月底快照装载。设置系统日期为2015年4月1日并且执行清单(五)-13-4里的脚本导入2015年3月的快照。         最后,执行相同的查询获取包含了迟到事实月底销售订单数据,查询语句和结果显示如下。 mysql> select     ->     year,     ->     month,     ->     product_name,     ->     month_order_amount amt,     ->     month_order_quantity qty     -> from     ->     month_end_sales_order_fact a,     ->     month_dim b,     ->     product_dim c     -> where     ->     a.order_month_sk = b.month_sk     ->         and a.product_sk = c.product_sk     -> order by year , month , product_name; +------+-------+--------------------------+----------+------+ | year | month | product_name             | amt      | qty  | +------+-------+--------------------------+----------+------+ | 2014 |     1 | LCD Panel                |  1000.00 | NULL | | 2014 |     2 | Hard Disk Drive          |  1000.00 | NULL | | 2014 |     3 | Floppy Drive             |  2000.00 | NULL | | 2014 |     4 | LCD Panel                |  2500.00 | NULL | | 2014 |     5 | Hard Disk Drive          |  3000.00 | NULL | | 2014 |     6 | Floppy Drive             |  3500.00 | NULL | | 2014 |     7 | LCD Panel                |  4000.00 | NULL | | 2014 |     8 | Hard Disk Drive          |  4500.00 | NULL | | 2014 |     9 | Floppy Drive             |  1000.00 | NULL | | 2014 |    10 | LCD Panel                |  1000.00 | NULL | | 2015 |     2 | Floppy Drive             |  5000.00 | NULL | | 2015 |     2 | Hard Disk Drive          |  1000.00 |   10 | | 2015 |     2 | LCD Panel                |  4000.00 | NULL | | 2015 |     3 | Flat Panel               | 47000.00 |  275 | | 2015 |     3 | Floppy Drive             | 25000.00 |  120 | | 2015 |     3 | Hard Disk Drive          | 46500.00 |  420 | | 2015 |     3 | High End Hard Disk Drive |  2000.00 |   20 | | 2015 |     3 | Keyboard                 | 27000.00 |   90 | +------+-------+--------------------------+----------+------+ 18 rows in set (0.00 sec)         对比‘前’‘后’查询的结果可以看到:

  • 2015年2月Floppy Drive的销售金额已经从4000改正为5000,这是由于迟到的产品销售订单增加了1000的销售金额。
  • 2015年2月的Hard Disk Drive(也是迟到的产品)被添加
  • 所有三月的销售订单被累加。包括在执行前面的清单(五)-13-4脚本时刚添加的High End Hard Disk Drive销售订单。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于Hadoop生态圈的数据仓库实践 —— 进阶技术(十四)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/52154160
用户1148526
2019/05/25
3880
维度模型数据仓库(十七) —— 无事实的事实表
(五)进阶技术         12. 无事实的事实表         本篇讨论一种技术,用来处理源数据中没有度量的需求。例如,产品源数据不包含产品数量信息,如果系统需要得到产品的数量,很显然不能简单地从数据仓库中直接得到。这时就要用到无事实的事实表技术。使用此技术可以通过持续跟踪产品的发布来计算产品的数量。可以创建一个只有产品(计什么数)和日期(什么时候计数)维度代理键的事实表。之所以叫做无事实的事实表是因为表本身并没有度量。         产品发布的无事实事实表  本节说明如何实现一个产品发布的无事实事实表,包括新增和初始装载product_count_fact表。图(五)- 12-1显示了跟踪产品发布数量的数据仓库模式(只显示与product_count_fact表有关的表)。
用户1148526
2022/06/14
9130
维度模型数据仓库(十七) —— 无事实的事实表
维度模型数据仓库(十三) —— 退化维度
(五)进阶技术         8. 退化维度         本篇讨论一种称为退化维度的技术。该技术减少维度的数量,简化维度数据仓库的模式。简单的模式比复杂的更容易理解,也有更好的查询性能。当一个维度没有数据仓库需要的任何数据时就可以退化此维度。需要把退化维度的相关数据迁移到事实表中,然后删除退化的维度。         退化订单维度         本节说明如何退化订单维度,包括对数据仓库模式和定期装载脚本的修改。使用维度退化技术时你首先要做的识别数据,分析从来不用的数据列。例如,订单维度的order_number列就可能是这样的一列。但如果用户想看事务的细节,还需要订单号。因此,在退化订单维度前,要把订单号迁移到sales_order_fact表。图(五)- 8-1显示了迁移后的模式。
用户1148526
2022/12/02
4.8K0
维度模型数据仓库(十三) —— 退化维度
Greenplum 实时数据仓库实践(8)——事实表技术
上一篇里介绍了几种基本的维度表技术,并用示例演示了每种技术的实现过程。本篇说明多维数据仓库中常见的事实表技术。我们将讲述五种基本事实表扩展技术,分别是周期快照、累积快照、无事实的事实表、迟到的事实和累积度量。和讨论维度表一样,也会从概念开始认识这些技术,继而给出常见的使用场景,最后以销售订单数据仓库为例,给出实现代码和测试过程。
用户1148526
2022/04/13
1.7K0
Greenplum 实时数据仓库实践(8)——事实表技术
维度模型数据仓库(十四) —— 杂项维度
(五)进阶技术         9. 杂项维度         本篇讨论杂项维度。简单地说,杂项维度就是一种包含的数据具有很少可能值的维度。例如销售订单,它可能有很多离散数据(yes-no这种类型的值),如
用户1148526
2022/12/02
7140
维度模型数据仓库(十四) —— 杂项维度
维度模型数据仓库(十九) —— 维度合并
(五)进阶技术         14. 维度合并         随着数据仓库中维度的增加,会发现有些通用的数据存在于多个维度中。例如,客户维度的客户邮编相关信息、送货邮编相关信息和工厂维度里都有邮编、城市和州。本篇说明如何把三个维度里的邮编相关信息合并到一个新的邮编维度。         修改数据仓库模式 为了合并维度,需要改变数据仓库模式。图(五)- 14-1显示了修改后的模式。新增了一个zip_code_dim表,sales_order_fact和production_fact表的结构也做了相应的修改。注意图中只显示了与邮编维度相关的表。
用户1148526
2022/06/14
6530
维度模型数据仓库(十九) —— 维度合并
基于Hadoop生态圈的数据仓库实践 —— 进阶技术
五、快照 前面实验说明了处理维度的扩展。本节讨论两种事实表的扩展技术。 有些用户,尤其是管理者,经常要看某个特定时间点的数据。也就是说,他们需要数据的快照。周期快照和累积快照是两种常用的事实表扩展技术。 周期快照是在一个给定的时间对事实表进行一段时期的总计。例如,一个月销售订单周期快照汇总每个月底时总的销售订单金额。 累积快照用于跟踪事实表的变化。例如,数据仓库可能需要累积(存储)销售订单从下订单的时间开始,到订单中的商品被打包、运输和到达的各阶段的时间点数据来跟踪订单生命周期的进展情况。用户可能要取得在某个给定时间点,销售订单处理状态的累积快照。 下面说明周期快照和累积快照的细节问题。 1. 周期快照 下面以销售订单的月底汇总为例说明如何实现一个周期快照。 首先需要添加一个新的事实表。下图中的模式显示了一个名为month_end_sales_order_fact的新事实表。
用户1148526
2019/05/25
6330
基于Hadoop生态圈的数据仓库实践 —— 进阶技术(十三)
十三、无事实的事实表 本节讨论一种技术,用来处理源数据中没有度量的需求。例如,产品源数据不包含产品数量信息,如果系统需要得到产品的数量,很显然不能简单地从数据仓库中直接得到。这时就要用到无事实的事实表技术。使用此技术可以通过持续跟踪产品的发布来计算产品的数量。可以创建一个只有产品(计什么数)和日期(什么时候计数)维度代理键的事实表。之所以叫做无事实的事实表是因为表本身并没有度量。 1. 产品发布的无事实事实表 本小节说明如何实现一个产品发布的无事实事实表,包括新增和初始装载product_count_fact表。下图显示了跟踪产品发布数量的数据仓库模式(只显示与product_count_fact表有关的表)。
用户1148526
2019/05/25
3540
Kettle构建Hadoop ETL实践(九):事实表技术
上两篇里介绍了几种基本的维度表技术,并用示例演示了每种技术的实现过程。本篇说明多维数据仓库中常见的事实表技术。我们将讲述五种基本事实表扩展,分别是周期快照、累积快照、无事实的事实表、迟到的事实和累积度量。和讨论维度表一样,也会从概念开始认识这些技术,继而给出常见的使用场景,最后以销售订单数据仓库为例,给出Kettle实现的作业、转换和测试过程。
用户1148526
2020/11/26
6K0
Kettle构建Hadoop ETL实践(九):事实表技术
维度模型数据仓库(十二) —— 多路径和参差不齐的层次
(五)进阶技术         7. 多路径和参差不齐的层次         本篇讨论多路径层次,它是对单路径层次的扩展。上一篇里数据仓库的月维度只有一条层次路径,即年-季度-月这条路径。在本篇中加一个新的级别,推广期,并且加一个新的年-推广期-月的层次路径。这时月维度将有两条层次路径,因此具有多路径层次。本篇讨论的另一个主题是不完全层次,这种层次在它的一个或多个级别上没有数据。         增加一个层次         执行清单(五)- 7-1里的脚本给month_dim表添加一个叫做campaign_session的新列,并建立campaign_session_stg过渡表。图(五)- 7-1显示添加后的模式。
用户1148526
2022/12/02
3860
维度模型数据仓库(十二) —— 多路径和参差不齐的层次
基于hadoop生态圈的数据仓库实践 —— OLAP与数据可视化(三)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/52314152
用户1148526
2019/05/25
8330
基于hadoop生态圈的数据仓库实践 —— 进阶技术(十五)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/52165035
用户1148526
2019/05/25
4850
Greenplum 实时数据仓库实践(7)——维度表技术
前面章节中,我们实现了实时多维数据仓库的基本功能,如使用Canal和Kafka实现实时数据同步,定义Greenplum rule执行实时数据装载逻辑等。本篇将继续讨论常见的维度表技术。
用户1148526
2022/01/06
2.5K0
Greenplum 实时数据仓库实践(7)——维度表技术
维度模型数据仓库(十一) —— 维度层次
(五)进阶技术         6. 维度层次         大多数维度都具有一个或多个层次。例如,日期维度就有一个四级层次:年、季度、月和日。这些级别用date_dim表里的列来表示。日期维度是一个单路径层次,因为除了年-季度-月-日这条路径外,它没有任何其它层次。本篇将讨论在维度的层次上进行分组和钻取查询。多路径层次在下一篇“多路径和参差不齐的层次”中讨论。         为了识别数据仓库里一个维度的层次,首先要理解维度中列的含义。然后就可以识别两个或多个列具有相同的主题。例如,日、月、季度和年具有相同的主题因为它们都是关于日历的。具有相同主题的列形成一个组。组中的一列必须包含至少一个组内的其它成员。例如,在前面提到的组中,月包含日。这些列的链条形成了一个层次。例如,日-月-季度-年这个链条是一个日期维度的层次。除了日期维度,产品和客户维度也有层次。 表(五)- 6-1显示了三个维度的层次。注意客户维度具有两个路径的层次。
用户1148526
2022/12/02
6900
维度模型数据仓库(十一) —— 维度层次
维度模型数据仓库(五) —— 定期装载
(四)定期装载         初始装载只在开始数据仓库使用前执行一次,然而,必须要按时调度定期执行装载源数据的过程。本篇说明执行定期装载的步骤,包括识别源数据与装载类型、使用SQL和Kettle两种方法开发和测试定期装载过程。         从源抽取数据导入数据仓库有两种方式,可以从源把数据抓取出来(拉),也可以请求源把数据发送(推)到数据仓库。影响选择数据抽取方式的一个重要因素是源数据的可用性和数据量,这基于是抽取整个源数据还是仅仅抽取自最后一次抽取以来的变化。考虑以下两个问题:
用户1148526
2022/12/02
3470
维度模型数据仓库(五) —— 定期装载
HAWQ取代传统数仓实践(十五)——事实表技术之无事实的事实表
本文介绍了数据仓库及其在技术社区中的应用,并重点讲解了数据仓库中的事实表和维度表的设计。在数据仓库中,通过将事实表与维度表关联,可以灵活地根据维度表中的属性进行查询。同时,通过在事实表和维度表之间建立关联,可以实现灵活的维度与度量之间的转换。最后,本文讲解了如何设计数据仓库以满足技术社区的需求,并提供了相应的示例。
用户1148526
2018/01/03
1K0
HAWQ取代传统数仓实践(十五)——事实表技术之无事实的事实表
维度模型数据仓库(十五) —— 多重星型模式
(五)进阶技术         10. 多重星型模式         从(五)进阶技术1.  “增加列”开始,已经通过增加列和表扩展了数据仓库,在(五)进阶技术5. “快照”里增加了第二个事实表,month_end_sales_order_fact表。这之后数据仓库模式就有了两个事实表(第一个是在开始建立数据仓库时创建的sales_order_fact表)。有了这两个事实表的数据仓库就是一个正式的双星型模式。         本篇将在现有的维度数据仓库上增加一个新的星型结构。与现有的与销售关联的星型结构不同,新的星型结构关注的是产品业务领域。新的星型结构有一个事实表和一个维度表,用于存储数据仓库中的产品数据。         一个新的星型模式         图(五)- 10-1 显示了扩展后的数据仓库模式。模式中有三个星型结构。sales_order_fact表是第一个星型结构的事实表,与其相关的维度表是customer_dim、product_dim、date_dim和sales_order_attribute_dim表。month_end_sales_order_fact表是第二个星型结构的事实表。product_dim和month_dim是其对应的维度表。第一个和第二个星型结构共享product_dim维度表。第二个星型结构的事实表和月份维度数据分别来自于第一个星型结构的事实表和date_dim维度表。它们不从源数据获得数据。第三个星型模式的事实表是新建的production_fact表。它的维度除了存储在已有的date_dim和product_dim表,还有一个新的factory_dim表。第三个星型结构的数据来自源数据。
用户1148526
2022/12/02
4060
维度模型数据仓库(十五) —— 多重星型模式
基于Hadoop生态圈的数据仓库实践 —— 进阶技术(六)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/52022982
用户1148526
2019/05/25
3780
HAWQ取代传统数仓实践(十四)——事实表技术之累积快照
本文总结了使用ETL处理大数据技术进行数据仓库建设的过程,包括数据提取、转换和加载(ETL)过程的构建和部署。主要介绍了ETL处理大数据的几种方法和技术,重点讲解了Apache NiFi和Talend这两个流行的开源ETL工具在大数据环境中的使用。
用户1148526
2018/01/03
2K0
HAWQ取代传统数仓实践(十四)——事实表技术之累积快照
维度模型数据仓库(六) —— 增加列
(五)进阶技术         1. 增加列         数据仓库最常碰到的扩展是给一个已经存在的维度表和事实表添加列。本篇先讨论如果需要增加列,模式会发生怎样的变化。然后进一步说明如何在客户维度和销售订单事实表上添加列,并在新列上应用SCD2。假设需要在客户维度中增加送货地址属性,并在销售订单事实表中增加数量度量值。
用户1148526
2022/12/02
6770
维度模型数据仓库(六) —— 增加列
推荐阅读
相关推荐
基于Hadoop生态圈的数据仓库实践 —— 进阶技术(十四)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验