ETL 操作 - 返回主键

use*_*254 2 etl data-warehouse talend

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

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

dimension
101  john smith

fact
111       1/3/2010
222       1/3/2010
Run Code Online (Sandbox Code Playgroud)

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

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

Dam*_*vic 5

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

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

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

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

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

  5. 传入的交易行也应该有客户 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
Run Code Online (Sandbox Code Playgroud)

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

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

事实表应该类似于:

DateKey     (PK)
CustomerKey
OrderNumber (PK)
Total
Run Code Online (Sandbox Code Playgroud)

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

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

DateKey CustomerBusinessKey OrderNumber Total
20100201  john_smith_101       111       500
20100301  john_smith_101       222       600
Run Code Online (Sandbox Code Playgroud)

此时,我们需要使用查找将 CustomerBusinessKey 替换为维度表中的 CustomerKey。因此,在查找之后,流将如下所示:

DateKey CustomerKey OrderNumber Total
20100201 12345       111         500
20100301 12345       222         600
Run Code Online (Sandbox Code Playgroud)

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

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