1

我正在尝试对可能跨分区重复的表进行去重复。例如

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
4

1 回答 1

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
;

有些分区在去重后可能会消失,但是如果你正在重写同一张表,插入覆盖不会删除它们,所以,如果你想在同一张表中保存数据,那么最好像最初的那样创建表,在其中插入去重数据,然后删除初始表并重命名重复数据删除的表。

于 2019-12-23T12:48:36.093 回答