获取 Hive 分区之间的增量更改
Posted
技术标签:
【中文标题】获取 Hive 分区之间的增量更改【英文标题】:Get incremental changes between Hive partitions 【发布时间】: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
建议?
【问题讨论】:
【参考方案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。以上是关于获取 Hive 分区之间的增量更改的主要内容,如果未能解决你的问题,请参考以下文章