【问题标题】:Spark SQL Data WarehousingSpark SQL 数据仓库
【发布时间】:2018-06-21 11:42:20
【问题描述】:

我有两个数据集,如下图-

历史:

+-------+-------+-----------+
|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 天完成初始加载后,我在增量/增量加载期间进行了协调工作,但很长一段时间以来我都没有接触过数据仓库,因此失去了这种清晰度。

union 后需要使用rank函数吗?还是有更好/更快的方法?非常有义务提供帮助。

【问题讨论】:

    标签: mysql sql pyspark-sql


    【解决方案1】:

    您可以将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 组合以产生所需的结果。

    【讨论】:

    • 嘿,感谢您的快速还原,想知道内部查询是做什么的,它只是根据常见 prod_id 的数量返回 1 的数量。
    • @AakashBasu。 . .没有任何inner query,也许您在谈论相关subquery
    • 是的,我错误地写了内部查询。你能更详细地解释相关子查询吗?我的意思是,它只是根据常见 prod_id 的数量返回 1 的数量。但是这里的 where 子句要确保什么?
    • @AakashBasu。 . . where 子句确保prod_ids 在Current 中可用,匹配Historical & 现在NOT EXISTS 只排除与where 子句匹配的行或prod_id。所以,它会重写为exists (select 1 from Current c1 where c1.prod_id <> h.prod_id);
    • 因此,在合并历史部分时,它将避免所有当前存在的 ID,因为这是优先级,对吗?谢谢!
    【解决方案2】:

    对于您发布的问题,使用排名是没有意义的,因为没有表示新行的列。例如时间戳。

    所以对于你提到的情况,你可以使用合并逻辑。

    您知道具有最新数据的表和具有历史数据的表。所以你的逻辑应该是合并两个表。

    以下是您可以在 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 
    

    如果数据存在于 current 中,它将从 current 中提取,否则它将从 historical 中提取。我已经加入了主键“prod_id”上的表。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 2018-09-02
      • 2016-10-26
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      相关资源
      最近更新 更多