在本节中,我们将向您展示如何手动设计 Talend SCD 类型 2 或缓慢变化维度。这是面试中可能会遇到的重要问题之一。
在此 Talend SCD 类型 2 手册演示中,我们使用了与之前相同的源表和目标表。请参阅 Talend SCD 示例文章。
以下是手动执行 Talend SCD 类型 2 所需的步骤列表。
- 我们需要 SKey 或代理键。每次向表中插入新记录时,SKey 都必须递增。因此,我们需要目标表中最高的或最大的 SKey 值。
- 我们必须将新记录插入 Emp_SCD2 表。
- 接下来,将新记录与现有表记录进行比较,以检查它是执行新插入还是更新。因此,我们需要执行查找。
- 在旧值每次更新后,我们必须用相同的 EmpID 和新的 SKey 值重新插入新记录。
- 接下来,我们必须更新旧记录的 scd_end date 为当前日期。
Talend SCD 类型 2 手动示例
首先,我们使用了一个 tDBInput,并编写了 SQL Select 语句来获取最大的代理键值。在这里,我们使用了 ISNULL 函数将 NULL 返回值替换为零。当您将第一条记录插入表时,SELECT MAX(SKey) FROM Emp_SCD2 会返回 NULL 值。为避免这种情况,我们使用了 ISNULL 和 MAX 函数。

点击 Edit Schema 并添加以下整数类型的列。这是因为上述 select 语句的返回值是单个值。

我将创建一个 上下文变量来存储最大 SKey 值。通过这种方式,我们可以在此作业中的任何组件中使用此上下文变量。我建议您添加默认值零,这是我们稍后进行的操作。

接下来,我们添加了 tJavaRow 组件并将输入行值分配给上下文变量。在这里,我们将最大代理键值存储在 Talend 上下文变量中。

在 OK 触发器上,让我添加另一个 tDBInput。此组件是实际的输入源表。

拖放 tMap 并将 tDBInput_1 主行连接到 tMap。接下来,添加 tDBOutput 以将记录插入或加载到目标表中。在连接 tMap 和 tDBOuput 时,它会要求您为此输出指定一个名称。在这里,我们将其命名为 Fresh_Insert。

我将把 tDBOuput 设置保留为默认值,因为我们稍后会更改它们。

双击 tMap 打开属性窗口。请点击 Automap! 按钮来映射列。

scd_start 表示当前时间或记录插入时间。因此,我将使用 Talend getCurrentDate 函数来获取当前日期。
scd_end date 可能因组织而异。对于 Talend SCD 类型 2 手动演示,我们使用 31-12-2999。请不要忘记使用 Talend parseDate 函数来解析或将字符串转换为 Date 数据类型。

在 Talend Numeric 部分下有一个序列化方法,可以按照指定步长插入从 1 到 N 的顺序编号,这与 SQL Auto Increment 相同。我们想从最大的代理键插入顺序编号,以便我们可以将上下文 SKey 作为第二个参数。

我们忘记在 Select 语句中加一,所以让我们加上它。Select Max(SKey) 会给出最大值,序列将从最大值开始,但它必须从下一个值开始。请记住,您也可以更改序列函数代码以加一。

我将操作更改为 Insert 并检查模式。接下来,我们将运行此 Talend SCD 类型 2 手动作业,以检查我们是否正在插入新记录。

在 SQL Management Studio 中,您可以看到带有代理键、scd_start 和 end date 的记录。

到目前为止,我们一直在执行简单的插入。为了了解它是新记录还是具有新值的旧记录,我们需要执行查找。所以,让我将 Emp_SCD2 表添加为 tMap 组件的查找表。我的意思是,我们正在实现一个 join。

双击 tMap,并将 EmpID 添加为公共键列。接下来,将 Join Model 更改为 Inner Join,并将 Match Model 更改为 Unique Math。通过这种方式,我们可以识别旧记录和新记录。

点击 Customize 图标,并将 Catch lookup inner join 选项从 false 更改为 true。它将捕获内部连接失败的记录,以便我们可以将它们传递到另一个输出。

让我添加另一个指向 Emp_SCD2 表的 tDBOutput,并将 tMap 输出名称指定为 Insert Existing with New columns。

在 tMap 属性中,我们使用 Auto map 连接所有列。接下来,我们将 scd_start 更改为当前日期,scd_end 更改为 2999,SKey 更改为顺序值。一切都与 Fresh_Insert 选项相同。

请点击 Expression 并添加以下 Expression。这里,equals 方法比较旧的 Income 值和新的 Income 值。!表示如果两者不相等,则执行此插入。

检查 tDBOutput 的所有选项,然后运行 Talend SCD 类型 2 手动作业。在运行此作业之前,我们将 EmpID 3 的 Income 更改为 666666。

您可以看到它已经插入了带有更新收入的新记录。

但是,我们必须更新旧记录的 scd_end date。为此,我们添加了另一个指向 Emp_SCD2 表的 tDBOutput。接下来,我们将其连接到 tMap 并将 Update_Dates 指定为输出名称。

在 tMap 中,将 Key 和 EmpID 的 scd_end date 更改为当前日期。请不要忘记添加以下 Expression 来检查哪个记录已更改以及要替换哪个记录。

请通过 Edit Schema 按钮更改要更新的数据部分并检查列。

我们完成了 Talend SCD 类型 2 手动作业的创建。让我截断 Emp_SCD2 表并恢复 Talend_Unite 表的默认值。从下面的 Talend SCD 类型 2 屏幕截图中,您可以看到 15 条记录已新鲜插入表中。

您可以在 SQL 表中看到相同的内容。

我将 EmpID 15 的 income 改为 999999 并运行作业。您可以看到一条新记录已插入,并发生了一次更新。

在 SQL Management studio 中,您可以看到新记录和旧记录以及更新日期。

到目前为止,我们一直在处理一个列的更改。但是,您可以使用逻辑运算符 || 来捕获多个更改。为了演示这一点,我们使用了 Sales 列。请更改 Update_dates 和 Insert Exsiting_with_NewValues 的 Expression。

我将更改一个记录的 Sales 值和另一个记录的 Income 值,然后运行 Talend SCD 类型 2 手动作业。
请查看输出。
