avatar

Hive数据去重及row_number()

业务需求:

hive 数据去重,并根据需求取其中一条

数据案例:

1
2
3
4
序号    feed_id      create_time   tag_time
1 6684032 1594137265 1593608403
2 6684032 1594137263 1593608403
3 6684056 1594137276 1594137276

只需要 1,3 两行的记录,因为第 2 行的 tag_time 和第一行的重复了,所以需要将 2 行重复的去掉。

方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
select
*
from(
select
*,
row_number() over (
partition by feed_id
order by
tag_time desc
) num
from
table
) t wheret.num = 1;

分析:
row_number()over (partition by feed_id order by tag_time desc) num    取 num=1  的           
意思是先根据 feed_id 进行分组,并在分组内部按 tag_time  降序排序,row_number()函数计算的值就表示某个 feed_id 组内部排序后的顺序编号(该编号在一个组内是连续并且唯一的) 。
所以最后直接去每个分组内的第一个(num=1)即可。

PS:
ROW_NUMBER() OVER 函数的基本用法  
语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
简单的说 row_number()从 1 开始,为每一个分组记录返回一个数字,这里的 ROW_NUMBER() OVER (ORDER BY xyz DESC)  是先把 xyz 列降序,再为降序以后的每条 xlh 记录返回一个序号。
示例:

1
2
3
4
5
xyz          row_num
600 1
400 2
300 3
200 4
文章作者: luochenxi
文章链接: https://luochenxi.github.io/2020/07/08/yuque/Hive%E6%95%B0%E6%8D%AE%E5%8E%BB%E9%87%8D%E5%8F%8Arow_number()/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Kirio

评论