Spark SQL数据仓库

时间:2018-06-21 11:42:20

标签: mysql sql pyspark-sql

我有两个数据集,如下所示-

历史记录:

+-------+-------+-----------+
|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天完成初始加载后在增量/增量加载期间执行对帐作业的,但是由于很长一段时间我一直与数据仓库无关,因此失去了清晰度。

合并后是否需要使用等级函数?还是有更好/更快的方法?很有必要提供帮助。

2 个答案:

答案 0 :(得分:2)

您可以将not existsunion结合使用:

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”上加入了表。

希望这会有所帮助!