如何查询 Hive 两个分区的 diff?

2022-07-16 00:27:48 +08:00
 zjdznl

假设一个 Hive 有十列: primary_key, user_id, column1, column2, ..., column8

每天会产出一个分区,假设今天和昨天产出的分区分别是 partion1 和 partion2

问:每个分区的数据按照 user_id 进行聚合( group by ), 如何找到 partion1 和 partion2 有 diff 的那些 user_id?

diff 的定义:聚合后的行数不同,或者任何其他 column 的数据有 diff


举个例子,这个 Hive 的数据,是用户的订单记录,包括 用户 ID 、用户名称、快递公司、快递单号等数据。那么,针对每个用户,今天的分区都可能有新的订单记录,或者用户名称等 column 发生了变化。

最终需要的 user_id 就是:

  1. partion1 新增了了订单记录
  2. partion1 中的其他 column 发生了变化(用户名称更改;针对同一条订单记录,partion2 没有快递单号,但是 partion1 有了)
1115 次点击
所在节点    问与答
3 条回复
chosenawp
2022-07-16 09:47:03 +08:00
left join 一下 where 条件带上对每个字段的判断
FYFX
2022-07-16 12:10:59 +08:00
1. partition1 相比较 partition2 的数据是增加的吗,存在删除的情况吗
2. 要是你能拿到上游每天追加的 binlog(或者类似的数据库日志)直接落 binlog 就好了
3. partition1 left partition2 ,key 是 user_id+快递单号,where 里面用 or 连接所有字段的判断,如果还需要变化的列名名称,select 里面再加一列用 concat 和 if(t1.col=t2.col,'col','')把结果拼起来
zjdznl
2022-07-22 00:24:44 +08:00
@chosenawp
@FYFX
最终确定的方案大概也差不多,不过多了一步,提前计算好某条记录需要比较的字段的 md5 落库,然后查询 diff 的时候直接比较 md5 是否一致就可以,不用比较所有列

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/866554

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX