2013-05-15 3 views
2

이 테이블이 있습니다. 내가 싶어하는 각 행에 대해입니다하이브에서 2 행 중에서 계산하는 방법은 무엇입니까?

+------------------------------------------------------------+ 
    |  ks  |  time  |  val1  | val2  | 
    +-------------+---------------+---------------+--------------+ 
    |  A  |  1  |  1  |  1  | 
    |  B  |  1  |  3  |  5  | 
    |  A  |  2  |  6  |  7  | 
    |  B  |  2  |  10  |  12  | 
    |  A  |  4  |  6  |  7  | 
    |  B  |  4  |  20  |  26  | 
    +------------------------------------------------------------+ 

,

ks | time | val1 | val1 of next ts of same ks | 

가 명확하게하려면, 위의 예제의 결과는

+------------------------------------------------------------+ 
    |  ks  |  time  |  val1  | next.val1 | 
    +-------------+---------------+---------------+--------------+ 
    |  A  |  1  |  1  |  6  | 
    |  B  |  1  |  3  |  10  | 
    |  A  |  2  |  6  |  6  | 
    |  B  |  2  |  10  |  20  | 
    |  A  |  4  |  6  |  null | 
    |  B  |  4  |  20  |  null | 
    +------------------------------------------------------------+ 

(나는 값 2에 대해 동일한 다음을 필요로해야한다 뿐만 아니라)

나는 이것에 대한 하이브 쿼리를 내놓기 위해 많은 노력을했지만 여전히 운이 없다. 내가 쿼리 here (Quassnoi의 대답) 언급 한 바와 같이 SQL에 대한 쿼리를 작성할 수 있지만 하이브가 하위 쿼리를 지원하지 않기 때문에 하이브에 상응하는 항목을 만들 수 없습니다.

누군가가 도와 드릴 수 있습니까?

미리 감사드립니다.

편집 : 나는 시도

쿼리

SELECT ks, time, val1, next[0] as next.val1 from 
(SELECT ks, time, val1 
     COALESCE(
     (
     SELECT Val1, time 
     FROM myTable mi 
     WHERE mi.val1 > m.val1 AND mi.ks = m.ks 
     ORDER BY time 
     LIMIT 1 
     ), CAST(0 AS BIGINT)) AS next 
FROM myTable m 
ORDER BY time) t2; 
+0

내게 귀하의 질의를 표시 –

+0

질문이 업데이트되었습니다. 감사. – Bee

+0

아래에 언급 된 추가 요구 사항을 반영하여 질문과 예제를 업데이트하십시오. 감사. –

답변

2

조회에 재무보고에 편재보고 "전에 년"매우 유사 보인다이었다. 제 생각에는 LEFT OUTER JOIN이 당신이 찾고있는 것입니다.

테이블 myTable을 자체 테이블에 조인하여 동일한 테이블 mn의 두 인스턴스를 명명합니다. 첫 번째 표의 모든 항목에 대해 m 의 일치하는 레코드를 찾으려고 시도하지만 동일한 ks 값이지만 증가 된 값은 time입니다. 이 레코드가 존재하지 않으면 n의 모든 열 값은 NULL이됩니다.

SELECT 
    m.ks, 
    m.time, 
    m.val1, 
    n.val1 as next_val1, 
    m.val2, 
    n.val2 as next_val2 
FROM 
    myTable m 
LEFT OUTER JOIN 
    myTable n 
ON (
    m.ks = n.ks 
AND 
    m.time + 1 = n.time 
); 

다음을 반환합니다.

ks time val1 next_val1 val2 next_val2 
A 1  1  6   1  7 
A 2  6  6   7  7 
A 3  6  NULL  7  NULL 
B 1  3  10   5  12 
B 2  10 20   12 26 
B 3  20 NULL  26 NULL 

희망이 있습니다.

+0

안녕하세요 Lukas, 답장을 보내 주셔서 감사합니다.하지만 제 시나리오는 조금 다릅니다. 제 표범이 당신을 오도해서 미안합니다. 이 경우 시간은 항상 1 씩 증가하지 않아도됩니다. 더 큰 간격을 가질 수도 있습니다. 그래서 우리는'm.time + 1 = n.time'을 사용할 수 없습니다. 감사. – Bee

+1

그런 경우에는 "ks, time"에 의해 myTable을 먼저 주문한 다음 행 번호를 추가하기 위해 하위 쿼리를 사용하는 것이 좋습니다. 그런 다음 시간이 아닌 위의 조인에서 행 번호를 사용할 수 있습니다. 희망이 도움이됩니다. –

+0

이 아이디어가 있었지만 행 번호 열을 추가하는 방법을 찾지 못했습니다. 주문 후 어떻게해야하는지 알려주시겠습니까? – Bee

2

하이브 사용자 정의 맵/감소 기능을 사용하면 이와 유사한 쿼리를 해결하는 데 효과적이라는 것을 알았습니다. 그것은 입력의 집합을 고려하고 하나 이상의 결과로 "감소"할 수있는 기회를 제공합니다.

answer은 해결책을 설명합니다.

열쇠는 CLUSTER BY을 사용하여 유사한 키 값을 가진 모든 결과를 동일한 감속기에 전송하므로 동일한 축소 스크립트를 사용하고 그에 따라 수집 한 다음 키가 변경되면 축소 된 결과를 출력하고 새 키를 수집하기 시작합니다 .

+0

고마워, 내가 보게. – Bee