我正在尝试删除重复的表,该表可能在多个分区之间重复。例如
id device_id os country unix_time app_id dt
2 2 3a UK 7 5 2019-12-22
1 2 3a USA 4 5 2019-12-22
1 2 3a USA 4 5 2019-12-23
1 2 3a USA 4 5 2019-12-24
可以看出,该表除了作为分区列的'dt'外,具有相似的列值。我想删除这样一个表,其中旧分区中的相似记录将被删除,而该记录保留在最新分区中。例如,经过重复数据删除后,上表应类似于下表。
id device_id os country unix_time app_id dt
2 2 3a UK 7 5 2019-12-22
1 2 3a USA 4 5 2019-12-24
答案 0 :(得分:0)
使用row_number
可以过滤重复项:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
INSERT OVERWRITE TABLE table_name_de_duplicated PARTITION (dt)
select id, device_id, os, country, unix_time, app_id, dt
from
(select id, device_id, os, country, unix_time, app_id, dt,
row_number() over(partition by id, device_id, os, country, unix_time, app_id order by dt desc ) rn
from table_name
) s
where rn=1
distribute by dt --to reduce the number of created files
;
某些分区在重复数据删除后可能会消失,但是如果您要重写同一张表,则插入覆盖不会将其删除,因此,如果要将数据保存在同一张表中,则最好像初始的那样创建表,然后插入重复数据删除的数据在其中,然后删除初始表并重命名去重复的表。