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 并重命名去重的数据。
我正在尝试删除可能跨分区重复的 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 并重命名去重的数据。