如何删除重复记录取决于无法在配置单元中排序的列
how to remove duplicated records depend on column not able to sort in hive
我有:
table 测试包含:
unique_id string , file_name string , mount bigint
日期样本:
uniqu_id , file_name , mount
1 , test.txt , 15
1 , test_R_file.txt , 50
3 , test_567.txt , 30
3 , test_567_R_file.txt , 100
我想做什么:
我需要查询以插入覆盖 table 我需要为每个重复的 uniqu_id 保留一条记录的地方,这条记录应该是 (R在文件名栏)
问题:
test table 在 hive 中是外部的 table(这意味着它不支持更新和删除操作)所以我想插入覆盖以删除 uniqu_id 中每个 uniqu_id 的重复记录=39=](如果我有 2 条相同的记录 unique_id 只有在文件名记录中有 (R) 的记录应该保留),我想使用排名,但我的想法是我没有要排序的列来知道我应该保留什么记录以及我应该删除什么记录我只有 file_name 列如果我有 2 条记录相同,我应该检查谁unique_id 知道我应该保留哪些记录,应该删除哪些记录
您可以按布尔表达式排序 R 是否存在于文件名中或不使用 CASE 表达式。您还可以在 CASE 中将 boolean 转换为 int 并向 CASE 添加更多条件以及添加更多 orderby 表达式,以逗号分隔。您可以按布尔值排序,因为 True 大于 False。
演示:
with mytable as (--demo dataset, use your table instead of this CTE
select 1 unique_id , 'test.txt' file_name , 15 mount union all
select 1 , 'test_R_file.txt' , 50 union all
select 3 , 'test_567.txt' , 30 union all
select 3 , 'test_567_R_file.txt' , 100
)
select unique_id, file_name, mount
from
(
select unique_id, file_name, mount,
row_number() over(partition by unique_id
order by file_name rlike '_R_' desc --True is greater than False
--order by something else if necessary
) rn
from mytable t
) s
where rn=1
结果:
unique_id file_name mount
1 test_R_file.txt 50
3 test_567_R_file.txt 100
如果每个 unique_id 可能有多个带有 R 的记录并且您想保留所有记录,请使用 rank
而不是 row_number
. Rank 将为所有 R 的记录分配 1,row_number 将为每个 unique_id.
的唯一此类记录分配 1
我有:
table 测试包含:
unique_id string , file_name string , mount bigint
日期样本:
uniqu_id , file_name , mount
1 , test.txt , 15
1 , test_R_file.txt , 50
3 , test_567.txt , 30
3 , test_567_R_file.txt , 100
我想做什么:
我需要查询以插入覆盖 table 我需要为每个重复的 uniqu_id 保留一条记录的地方,这条记录应该是 (R在文件名栏)
问题:
test table 在 hive 中是外部的 table(这意味着它不支持更新和删除操作)所以我想插入覆盖以删除 uniqu_id 中每个 uniqu_id 的重复记录=39=](如果我有 2 条相同的记录 unique_id 只有在文件名记录中有 (R) 的记录应该保留),我想使用排名,但我的想法是我没有要排序的列来知道我应该保留什么记录以及我应该删除什么记录我只有 file_name 列如果我有 2 条记录相同,我应该检查谁unique_id 知道我应该保留哪些记录,应该删除哪些记录
您可以按布尔表达式排序 R 是否存在于文件名中或不使用 CASE 表达式。您还可以在 CASE 中将 boolean 转换为 int 并向 CASE 添加更多条件以及添加更多 orderby 表达式,以逗号分隔。您可以按布尔值排序,因为 True 大于 False。
演示:
with mytable as (--demo dataset, use your table instead of this CTE
select 1 unique_id , 'test.txt' file_name , 15 mount union all
select 1 , 'test_R_file.txt' , 50 union all
select 3 , 'test_567.txt' , 30 union all
select 3 , 'test_567_R_file.txt' , 100
)
select unique_id, file_name, mount
from
(
select unique_id, file_name, mount,
row_number() over(partition by unique_id
order by file_name rlike '_R_' desc --True is greater than False
--order by something else if necessary
) rn
from mytable t
) s
where rn=1
结果:
unique_id file_name mount
1 test_R_file.txt 50
3 test_567_R_file.txt 100
如果每个 unique_id 可能有多个带有 R 的记录并且您想保留所有记录,请使用 rank
而不是 row_number
. Rank 将为所有 R 的记录分配 1,row_number 将为每个 unique_id.