我正在尝试构建CDC(更改数据捕获)逻辑,在该逻辑中(对于任何给定的键集)将每个源记录与目标中最新记录(该键的记录)进行比较。对于任何给定的键,目标可以保存许多记录(随时间变化的历史记录)。现在,每个源记录将基于自然键加入到目标表中。
如果键匹配,则比较以下项的数据列中的值 源记录和目标以标识任何更改。如果有 差异(在任何列中)将此记录插入作为“ 更新” ( SCD-2 )
如果键匹配,但任何一个值中的没有更改 比较列,然后放弃该记录。
当源记录找不到与任何现有记录的键匹配时 记录到目标中,然后还将该记录作为<<>新 插入 记录”。
最后,目标表应具有现有记录(不匹配)
例如:
来源:
id|state|zip
-----------
1|NY|10234
2|CA|94623
3|PA|56712
现有目标:
id|state|zip|proc_date
---------------------
1|NY|10234|2019-05-03
1|MD|23944|2019-05-08
2|CA|94623|2019-04-15
5|MO|78132|2019-05-10
要求输出:
id|state|zip|proc_date
---------------------
1|NY|10234|2019-05-03 --> Existing history
1|MD|23944|2019-05-08 --> Existing latest record to compare with
1|NY|10234|2019-05-21 --> Insert as update
2|CA|94623|2019-04-15 --> Existing No-Change
5|MO|78132|2019-05-10 --> Existing No-Change
3|PA|56712|2019-05-21 --> New id insert
请注意,id = 1已经有2条现有记录,其中'2019-05-03'上的记录具有相同的数据值。但是相反,由于它是最新的历史记录,因此将使用2018-05-08上的记录与来源进行比较。
为了比较源和目标之间的数据列,我希望将所有数据列连接起来并应用MD5函数,并生成哈希值,然后在源和目标之间进行比较。
请让我知道您的想法,或者是否需要其他信息。这只能通过 Spark-SQL 解决。
预先感谢您的帮助。