使用Spark SQL更改数据捕获

时间:2019-06-18 18:51:20

标签: sql apache-spark-sql

我有几张与A -> Left Join -> B -> Left join -> C相关的表。让我们将A称为driving table,将B & C称为"supporting"表。这些表中的每个表都有一个last_update_date列。我的要求是,不仅要确定行驶表中自上次处理日期以来的更改记录(可作为参数),而且要确定支持表中任何列的更改。

Table A  
------  
empid|salary|last_updt_dt  
123|20000|05/14/2019   

Table B  
-------  
empid|fname|lname|last_updt_date  
123|John|Taylor|05/16/2019  

Table C  
-------  
empid|address|last_updt_dt  
123|Maryland|05/17/2019  

假设,= 05/10/2019

因此,假设在第1天(05/20/2019)执行作业,则输出应为:

empid|fname|lname|salary|address|last_exec_date  
-----------------------------------------------    
123|John|Taylor|20000|Maryland|05/20/2019 

现在,让我们假设在第2天(05/21/2019),地址从Maryland更改为California。因此,在第2天,输出表应如下所示:

empid|fname|lname|salary|address|last_exec_date  
-----------------------------------------------    
123|John|Taylor|20000|Maryland|05/20/2019 
123|John|Taylor|20000|California|05/21/2019 
561|Peter|Anderson|50000|Missouri|05/21/2019

要注意的一点是,在第2天,任何“支持表”(在这种情况下为Table-C“地址”列)的更改均触发了另一条记录的插入,该记录已于昨天早些时候处理过,但现在具有更新的值。地址栏。另请注意,在第2天,其他插入会像其他任何符合条件的记录(如果有)的常规插入一样按原样进行。 Empid = 561。

SELECT
A.empid, B.fname, B.lname, A.salary, C.address, current_date() as last_exec_date
from A
left outer join B
on A.empid = B.empid
left outer join B.empid = C.empid
where to_date(A.last_updt_dt, 'yyyyMMdd') > {last_exec_date}
OR to_date(A.last_updt_dt, 'yyyyMMdd') > {last_exec_date}
to_date(A.last_updt_dt, 'yyyyMMdd') > {last_exec_date}

我的挑战是如何触发和传播来自任何参与的支持表的任何更改,即使该更改与先前已处理并插入到目标表的记录有关,以使新记录具有更新后的值显示在目标表中。 换句话说,如何通过其他支持(非驱动程序)表中的任何更改触发记录

0 个答案:

没有答案