Talend SCD 类型 2 手册

在本节中,我们将向您展示如何手动设计 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 函数

Configure Source Connection and query table

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

Edit Schema and add a single column of int

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

Create one Context variable

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

Talend SCD Type 2 Manual 4

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

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

Add tMap Output

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

Talend SCD Type 2 Manual 7

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

Talend SCD Type 2 Manual 8

scd_start 表示当前时间或记录插入时间。因此,我将使用 Talend getCurrentDate 函数来获取当前日期。

scd_end date 可能因组织而异。对于 Talend SCD 类型 2 手动演示,我们使用 31-12-2999。请不要忘记使用 Talend parseDate 函数来解析或将字符串转换为 Date 数据类型。

Talend SCD Type 2 Manual 9

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

Talend SCD Type 2 Manual Sequencing Method

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

Talend SCD Type 2 Manual 11

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

Configure tDBOutput

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

Table Records

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

Talend SCD Type 2 Manual 14

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

Talend SCD Type 2 Manual 15

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

Talend SCD Type 2 Custom 16

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

Assign the tMap to tDBOutput

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

Talend SCD Type 2 Custom 18

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

Talend SCD Type 2 Custom 19

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

Configure the tDBOutput of the custom

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

Result Table

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

Talend SCD Type 2 Custom 22

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

Talend SCD Type 2 Custom 23

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

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

Talend SCD Type 2 Custom 25

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

Destination table

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

Talend SCD Type 2 Custom 27

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

Result set

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

Talend SCD Type 2 Custom 29

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

请查看输出。

Final Result