根据2列组合选择行

时间:2018-05-30 11:19:12

标签: hive

我的桌子有以下(部分)结构:

id_1 score_1 id_2 score_2
77    10    88   50
77    10    88   30
77    25    88   50
77    25    88   30

意思是,id可以得到多个分数 我想要的是保留id组合所在的行与每个score的最大id

在上述示例中,我只想留下以下一行:

id_1 score_1 id_2 score_2
77    25    88   50

我尝试使用自加入方法,但没有成功。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果您想要所有组合,则需要执行完全连接,具体取决于您可能需要设置以下属性的Hive配置

set hive.mapred.mode=nonstrict

此查询适用于您的案例。演示:

create table tmp3 
(
id_1 string, score int, id_2 string, score_2 int

);

INSERT INTO TABLE tmp3
VALUES (77, 10,    88,   50),(77  ,  10   , 88  , 30),(77  ,  25  ,  88 ,  50),(77  ,  25  ,  88 ,  30);

select a.id_1, a.score, b.id_2,b.score_2 from 
(
select id_1, max(score) as score from tmp3 group by id_1
) a
full join 
(
select id_2, max(score_2) as score_2 from tmp3 group by id_2

) b; 

结果

a.id_1,a.score,b.id_2,b.score_2
77,25,88,50

顺便说一句,根据您的数据大小和ID的分布情况,fulljoin可能需要几个时间..

更新: 更新使用窗口功能的答案,然后选择多列以获得最高分数

select a.id_1, a.score, b.id_2,b.score_2 from 
(
select id_1, score from (
select id_1,  score , 
ROW_NUMBER() OVER (partition by id_1 order by score desc) AS row_num
from tmp3
) x1 where row_num = 1
) a
full join 
(
select id_2, score_2 from (
select id_2,  score_2  ,
ROW_NUMBER() OVER (partition by id_2 order by score_2 desc) AS row_num
from tmp3
) x2 where row_num = 1

) b;