配置单元重复数据删除跨多个分区

时间:2019-12-23 11:04:12

标签: hive duplicates hiveql hive-partitions

我正在尝试删除重复的表,该表可能在多个分区之间重复。例如

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

1 个答案:

答案 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
;

某些分区在重复数据删除后可能会消失,但是如果您要重写同一张表,则插入覆盖不会将其删除,因此,如果要将数据保存在同一张表中,则最好像初始的那样创建表,然后插入重复数据删除的数据在其中,然后删除初始表并重命名去重复的表。