2016-06-01 3 views
0

다음과 유사한 테이블이 있습니다. 각 그룹에 대해 하이브 그룹화 된 결과의 각 그룹에 대해 그룹화되지 않은 열을 얻는 방법은 무엇입니까?

|name | grp | dt  
------------------------------ 
|foo | A | 2016-01-01 
|bar | A | 2016-01-02 
|hai | B | 2016-01-01 
|bai | B | 2016-01-02 
|baz | C | 2016-01-01 

, 나는 namedt 가장 최근의 찾고 싶어요.

|name | grp | dt  
------------------------------ 
|bar | A  | 2016-01-02 
|bai | B  | 2016-01-02 
|baz | C  | 2016-01-01 

오라클에서 다음 쿼리가 작동하고 매우 깨끗합니다 (에서 촬영 : 즉, MAX (DT), GRP에 의해 그룹 및 DT 이름을 연관 출력에 그룹의 최대이다 here) :

SELECT o.name, o.grp, o.dt 
FROM tab o 
    LEFT JOIN tab b 
     ON o.grp = b.grp AND o.dt < b.dt 
WHERE b.dt IS NULL 

그러나 이것은 documentation을 인용 다른 question에서 [Error 10017]: Line 4:43 Both left and right aliases encountered in JOIN 'service_effective_from' 실패, 내가 조인 문에 비항 등 연산자를 사용할 수 없다는 것을 배울 :

하이브에서는 평등 조인, 외부 조인 및 왼쪽 세미 조인 만 지원됩니다. Hive는 map/reduce 작업과 같은 조건을 표현하기가 매우 어렵 기 때문에 평등 조건이 아닌 조인 조건을 지원하지 않습니다.

조인 조건에서 부등식 연산자를 사용할 수 없다는 가정하에 하이브에서이를 구할 수있는 깨끗한 해결책은 무엇입니까?

+0

dt가 그룹당 가장 최근의 이름 인'name'을 찾고 싶다면'foo'가 반환되는 이유는 무엇입니까? 그룹'A'에서 가장 최근의 것이 아닌'2016-01-01'과 관련이 있습니다. – gobrewers14

+0

@ GoBrewers14 내 사과; 당신이 올바른지; 나는 그것을 '바'로 편집했다. –

답변

0

다음 작품은 here에서 가져온 것입니다,하지만 난 그게 매우 깨끗 찾을 수 없습니다 : AS를

SELECT o.name, ogrp, o.dt 
FROM tab o 
    JOIN (
     SELECT grp, MAX(dt) dt 
     FROM tab 
     GROUP BY grp 
    ) b 
     ON o.grp = b.grp AND o.dt = b.dt 

를 제외하고, 그것은 4 행과 비교 테스트 테이블 내 환경 164 초 정도 걸립니다.

관련 문제