복붙노트

[HADOOP] 하이브 : 어떻게 출력 HiveQL을 사용하여 고유 한 기본 키를 SELECT 쿼리를 할까?

HADOOP

하이브 : 어떻게 출력 HiveQL을 사용하여 고유 한 기본 키를 SELECT 쿼리를 할까?

난 내가 SQL에 수출 할 수있는 테이블로 변환하려면 다음 스키마의 데이터 집합을 가지고있다. 나는 하이브를 사용하고 있습니다. 입력 다음과 같이

call_id,stat1,stat2,stat3
1,a,b,c,
2,x,y,z,
3,d,e,f,
1,j,k,l,

출력 테이블은 고유해야하므로 기본 키로 call_id 있어야합니다. 출력 스키마는해야한다

call_id,stat2,stat3,
1,b,c, or (1,k,l)
2,y,z,
3,e,f,

문제는 내가 HIVE 쿼리에 키워드 DISTINCT를 사용할 때 DISTINCT가 결합 된 모든 colums에 적용한다는 것입니다. 난 단지 call_id에 DISTINCT 작업을 적용 할. 의 라인에 뭔가

SELECT DISTINCT(call_id), stat2,stat3 from intable;

그러나이 (나도 SQL에서 잘 정통하고 있지 않다) HIVE에 유효하지 않습니다.

유일한 합법적 인 쿼리는 것 같다

SELECT DISTINCT call_id, stat2,stat3 from intable; 

다른 열이 다른 전체에 행이 구별된다 그러나이 같은 call_id 여러 행을 반환합니다.

참고 등 A, B, C, X, Y, Z, 사이 산술 관계가없는 것은 그래서 평균 또는 합산 어떤 트릭 실용적이 아니다.

모든 아이디어를 어떻게하면 할 수 있습니까?

해결법

  1. ==============================

    1.한 빠른 생각하지 최고의 하나,하지만 워크를 할 것입니다

    한 빠른 생각하지 최고의 하나,하지만 워크를 할 것입니다

    하이브> TEMP1 테이블 (a INT, B 열)을 생성;

    하이브> 덮어 쓰기 테이블 TEMP1를 삽입

    call_id, 최대 ( '|', stat2, '|'CONCAT (STAT1, STAT3))을 선택 call_id에 의해 intable 그룹을;

    테이블의 하이브> 삽입 덮어 쓰기 테이블

    ( '|', b) [1], 분할 (b를 '|') | ( ', B)을 [0], 분할 A, 분할을 선택 [2] TEMP1에서;

  2. ==============================

    2.하지만 어떻게 다음 하이브는 제거 할 행 알 수 있습니까?

    하지만 어떻게 다음 하이브는 제거 할 행 알 수 있습니까?

    당신이 가지고있는 합계 필드의 데이터 / 크기의 양을 모른 채, 다음 쿼리 수있는 작업 :

    select distinct i1.call_id, i1.stat2, i1.stat3 from (
      select call_id, MIN(concat(stat1, stat2, stat3)) as smin 
      from intable group by call_id
    ) i2 join intable i1 on i1.call_id = i2.call_id 
      AND concat(i1.stat1, i1.stat2, i1.stat3) = i2.smin;
    
  3. from https://stackoverflow.com/questions/15023661/hive-how-to-do-a-select-query-to-output-a-unique-primary-key-using-hiveql by cc-by-sa and MIT license