Hive 跨多个分区的配置单元表重复数据消除

Hive 跨多个分区的配置单元表重复数据消除,hive,duplicates,hiveql,hive-partitions,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 2

我正在尝试消除一个跨分区可能存在重复项的表的重复项。比如说

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

使用
row\u 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
;

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

使用
行号
可以筛选重复项:

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
;
重复数据消除后,某些分区可能会消失,但如果您正在重写同一个表,则“插入覆盖”将不会删除这些分区。因此,如果您希望将数据保存在同一个表中,则最好创建与初始表类似的表,在其中插入已消除重复的数据,然后删除初始表并重命名已消除重复的表