首页 > 解决方案 > 更新事实表

问题描述

我有一个平面文件资源,这些资源被提取到事实和维度中。一些维度也来自数据库资源。转换过程是根据需要设置的(如果有新的/更新的平面文件)。问题是,某些数据引用不存在或基于数据库资源的维度不匹配,因此事实的外键 id 值设置为默认值(如果没有匹配数据,则为零)。

如果所述维度(数据库资源)已更新,我如何对事实执行更新?这种场景的最佳实践/例程是什么?

这是示例插图

Flatfile source                           product list (db source)
--------------------------------          ------------------------------
| product name | year | volume |          | prodcode |  name           |
--------------------------------          ------------------------------
| apple        | 2020 |  1000  |          | 001      | apple           |
| watermelon   | 2020 |  2000  |          | 002      | mango           |
--------------------------------          ------------------------------

事实/维度

production_fact                           dim_product
-------------------------------          ---------------------------
| fk_product| fk_date| volume |          | id | prodcode |  name   |
-------------------------------          --------------------------|
| 2         |  d001  |  1000  |          |  1 |  n/a      | n/a    |
| 1         |  d001  |  2000  |          |  2 |  001      | apple  |
-------------------------------          |  3 |  002      | mango  |
                                         ---------------------------

如果要更新产品列表(003 西瓜),我应该用新值替换 dim_product row#1 吗?

标签: databaseetldata-warehousedata-ingestionsql-data-warehouse

解决方案


根据您的示例,这是它应该工作的方式:

注意:我希望 prodcode 位于平面文件中,而不是产品名称中。这真的是您的数据的样子吗?无论如何,我会继续。

第一组数据到达。西瓜实际上是但不是维度。

Flatfile source                           product list (db source)
--------------------------------          ------------------------------
| product name | year | volume |          | prodcode |  name           |
--------------------------------          ------------------------------
| apple        | 2020 |  1000  |          | 001      | apple           |
| watermelon   | 2020 |  2000  |          | 002      | mango           |
--------------------------------          ------------------------------

我们加载了一个维度记录,但它没有任何属性值。(正如我所说,我通常希望代码在实际输入数据中,但这很好,我们将进行描述)。这当然需要一些逻辑来找到实际上但不是维度的维度。

production_fact                           dim_product
-------------------------------      ------------------------------------------------
| fk_product| fk_date| volume |      | id | prodcode |  name       | weight |colour |
-------------------------------      ------------------------------------------------
| 2         |  d001  |  1000  |      |  1 |  n/a      | n/a        | n/a    | n/a   |
| 4         |  d001  |  2000  |      |  2 |  001      | apple      | 200mg  | red   |
-------------------------------      |  3 |  002      | mango      | 400mg  | yellow|
                                     |  4 |  ?        | watermelon | ?      |   ?   |
                                     ------------------------------------------------

所以我们有维度 SK 4,这是一个合法的维度记录,只是它缺少大量属性。

后来,次元来了。我们知道匹配的含义,因此我们更新了缺少数据的现有维度。

 product list (db source)
-----------------------------------------------
| prodcode |  name           | weight |colour |
--------------------------------------|-------|
| 003      | watermelon      | 1kg    | green |
-----------------------------------------------


------------------------------------------------
| id | prodcode |  name       | weight |colour |
------------------------------------------------
|  1 |  n/a      | n/a        | n/a    | n/a   |
|  2 |  001      | apple      | 200mg  | red   |
|  3 |  002      | mango      | 400mg  | yellow|
|  4 |  003      | watermelon | 1kg    | green |
------------------------------------------------

您希望避免更新大型事实。更新较小的尺寸是一个更好的主意

顺便说一句,这是一个类型 1 维度。您可以对 SCD 采用相同的方法,只是您不会计算维度的第一个版本,而只是覆盖它。


推荐阅读