Hive table 跨多个分区去重

Hive table deduplication across multiple partitions

我正在尝试删除可能跨分区重复的 table。例如

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'是分区列,table的列值相似。我想删除这样一个 table 的重复项,其中旧分区中的类似记录将被删除,而将记录留在最新的分区中。例如,上面的 table 在去重后应该看起来像下面的 table。

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

使用 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
;

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