我有两个数据集,如下所示-
历史记录:
+-------+-------+-----------+
|prod_id|prod_cd| prod_desc|
+-------+-------+-----------+
| 42546|Firefox|Firefox 4.0|
| 12432| Chrome| Chrome 1.0|
+-------+-------+-----------+
当前:
+-------+-------+----------+
|prod_id|prod_cd| prod_desc|
+-------+-------+----------+
| 53243| IE| IE 2.0|
| 12432| Chrome|Chrome 1.5|
+-------+-------+----------+
我想在两个表(数据框)上运行(火花)sql查询,并获取所有历史记录和新条目,其中两者之间的共同点将从最新表中选取并删除旧表(类似于更新那些旧表)相应的行)。
所以,我的输出表应该像-
+-------+-------+-----------+
|prod_id|prod_cd| prod_desc|
+-------+-------+-----------+
| 42546|Firefox|Firefox 4.0|
| 53243| IE| IE 2.0|
| 12432| Chrome| Chrome 1.5|
+-------+-------+-----------+
我是在第0天完成初始加载后在增量/增量加载期间执行对帐作业的,但是由于很长一段时间我一直与数据仓库无关,因此失去了清晰度。
合并后是否需要使用等级函数?还是有更好/更快的方法?很有必要提供帮助。
答案 0 :(得分:2)
您可以将not exists
与union
结合使用:
select prod_id, prod_cd, prod_desc
from Current c
union all
select prod_id, prod_cd, prod_desc
from Historical h
where not exists (select 1 from Current c1 where c1.prod_id = h.prod_id);
对理解的单词排序:
在前面的查询中,这将首先返回Current
数据,然后在 correlated的帮助下返回Historical
数据(即 current 中不存在的数据) subquery
。
因此,这将返回两个结果集,这些结果集通过集合运算符UNION ALL
组合以产生所需的结果。
答案 1 :(得分:0)
对于您发布的问题,使用等级没有意义,因为没有列指示新行。例如时间戳记。
因此,对于您提到的情况,可以使用合并逻辑。
您知道具有最新数据的表和具有历史数据的表。因此,您的逻辑应该是合并两个表。
以下是您可以在Spark SQL中完成的一种方法
select
case when(c.prod_id is null) then h.prod_id else c.prod_id end as prod_id,
case when(c.prod_id is null) then h.prod_cd else c.prod_cd end as prod_cd,
case when(c.prod_id is null) then h.prod_desc else c.prod_desc end as prod_desc
from historical h
full outer join current c on
h.prod_id = c.prod_id
如果当前中存在数据,它将从当前中提取,否则将从历史中提取。我已经在主键“ prod_id”上加入了表。
希望这会有所帮助!