【问题标题】:Get incremental changes between Hive partitions获取 Hive 分区之间的增量更改
【发布时间】:2013-11-13 05:18:25
【问题描述】:

我有一个夜间工作,在 hive 中运行和计算一些数据。它是按天划分的。

字段: id 大整数 排名 bigint

昨天 输出/dt=2013-10-31 今天 输出/dt=2013-11-01

我试图弄清楚是否有一种简单的方法可以在今天和昨天之间进行增量更改

我正在考虑做一个左外连接,但不确定它是什么样子,因为它是同一张表

这就是当有不同的表时的样子

从左外连接中选择 * b ON (a.id=b.id AND a.dt='2013-11-01' and b.dt='2-13-10-31') WHERE a.rank!=B.rank

但在同一张桌子上

SELECT * FROM a LEFT OUTER JOIN a ON (a.id=a.id AND a.dt='2013-11-01' and a.dt='2-13-10-31') WHERE a.rank!=a.rank

建议?

【问题讨论】:

    标签: join hadoop hive


    【解决方案1】:

    这样就可以了

    SELECT a.* 
    FROM A a LEFT OUTER JOIN A b ON a.id = b.id
    WHERE a.dt='2013-11-01' AND b.dt='2013-10-31' AND <your-rank-conditions>;
    

    有效地,这将只跨越 1 个 MapReduce 作业。

    【讨论】:

      【解决方案2】:

      所以我想通了...使用子查询和连接

      select * from (select * from table where dt='2013-11-01') a 全外连接 (从 dt='2013-10-31' 的表中选择 *)b 在 (a.id=b.id) 其中 a.rank!=b.rank 或 a.rank 为 null 或 b.rank 为 null

      以上将为您提供差异..

      您可以查看差异并找出您需要添加/更新/删除的内容

      更新如果 a.rank!=null 和 b.rank!=null 即排名改变 DELETE IF a.rank=null and b.rank!=null 即用户不再排名 如果 a.rank!=null 和 b.rank=null 则添加,即这是一个新用户

      【讨论】:

      • Query 是一个冠军,而且切中要害,但会跨越 3 个 MapReduce 作业。另外,当 LEFT OUTER JOIN 可以为我们提供差异/增量数据时,我无法弄清楚为什么我们需要 FULL OUTER JOIN。
      猜你喜欢
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 2010-10-03
      相关资源
      最近更新 更多