2

我正在使用 Talend 填充数据仓库。我的工作是将客户数据写入维度表,将交易数据写入事实表。事实表上的代理键 (p_key) 是自动递增的。当我插入一个新客户时,我需要我的事实表来反映相关客户的 ID。

正如我提到的,我的 p_key 是 auto_incrementing,所以我不能只为 p_key 插入任意值。

关于如何在我的维度表中插入一行并仍然检索主键以在我的事实记录中引用的任何想法?

更多信息:

如果传入的数据没有标准化怎么办?例如,我有一个包含以下数据的 csv:

order #   date        total customer# first_name last_name
111       1/2/2010    500    101      John        Smith     
222       1/3/2010    600    101      John        Smith

显然,我希望客户信息出现在维度表中,而交易数据出现在事实表中:

dimension
101  john smith

fact
111       1/3/2010
222       1/3/2010

正如您所提到的,维度表的键将是自动递增的。事实表需要引用这个键。您如何设计 etl 作业以便在插入后返回代理键?

此外,如果对客户数据进行了重复数据删除(如上所述),您将如何处理密钥?

4

1 回答 1

5

我可能误解了你的问题,但是:

  1. 事实表可能有也可能没有自动递增的 PK,通常事实表中的 PK 是多个引用维度表的 FK 的组合。

  2. 维度表应该有一个自动递增的 PK。

  3. 新客户应该在事务事实到达 DW(或至少是事实表)之前“登陆”到客户维度表中。

  4. 维度表应该有一个唯一标识客户的 BusinessKey——例如电子邮件、全名 + 密码或类似信息。

  5. 传入的交易行也应该有 customer BusinessKey 字段——这就是我们识别客户的方式。

  6. 在将事务插入事实表之前,使用 BusinessKey 从客户维度表中查找客户 PrimaryKey。

编辑

如果您的新客户数据与交易捆绑在一起,请找到一种方法来提取客户数据并在交易之前将其路由到 DW。

更新:

首先加载 dimCustomer,决定 BusinessKey - 所以维度看起来像:

CustomerKey = 12345 (auto-incremented)
CustomerBusinessKey = john_smith_101 (must uniquely identify the John Smith)
CustomerFirstName = John
CustomerLastName = Smith

在维度加载过程中,您必须将传入行分隔为两个流,现有客户和新客户。“现有客户”流中的行更新暗表(类型 1 SCD),同时插入“新客户”流中的行。正在插入的行流中不应有重复项;您可以通过将它们插入临时表并在那里删除重复项来完成此操作,就在最终插入维度表之前。您还可以提取重复项并将它们路由回加载过程以更新客户记录;它们可能包含更新的数据——例如更新的电话号码或类似信息。

一旦客户进来,加载事实。

事实表应如下所示:

DateKey     (PK)
CustomerKey
OrderNumber (PK)
Total

我使用了 DateKey 和 OrderNumber 的复合主键,允许不时重置订单号序列。

在加载过程中,将事实记录修改为如下所示:

DateKey CustomerBusinessKey OrderNumber Total
20100201  john_smith_101       111       500
20100301  john_smith_101       222       600

此时,我们需要使用查找将 CustomerBusinessKey 替换为维度表中的 CustomerKey。因此,在查找之后,流看起来像:

DateKey CustomerKey OrderNumber Total
20100201 12345       111         500
20100301 12345       222         600

现在可以将其插入事实表中。

我也作弊了一点——没有从 dimDate 中查找日期键,也没有在事实表中查找现有行。加载事实表时,您可以在加载之前查找现有的 (DateKey, OrderNumer) 组合,或者您可以将其留给主键以防止重复——您的选择。在任何情况下,请确保将相同数据重新加载到事实表中的尝试失败。

于 2010-03-26T11:42:13.527 回答