복붙노트

[HADOOP] hiveql에서 열을 행으로 변환 (UNPIVOT)

HADOOP

hiveql에서 열을 행으로 변환 (UNPIVOT)

다음과 같은 구조의 테이블이 있습니다.

column1, column2, column3, X1, X2, X3, X4
A1,      A2,      A3,      5,  6,  1,  4

이걸로 변환하고 싶습니다.

column1, column2, column3, Key, Value 
 A1,      A2,      A3,      X1,  5
 A1,      A2,      A3,      X2,  6 
 A1,      A2,      A3,      X3,  1
 A1,      A2,      A3,      X4   4

"UNION ALL"과 함께 스티칭 된 4 개의 쿼리를 사용하여이 작업을 수행 할 수 있었지만, 테이블이 거대하고 각각의 select가 긴 map-reduce로 변환되기 때문에 UNION을 사용하면 쿼리가 이상적으로 걸릴 시간이 N 배가됩니다. 여기서 N은 피벗 할 열의 수입니다.

explode () 미리 정의 된 UDTF를 탐색 해 보았습니다. 그러나이 예제에서는 작동하지 않습니다. 나는 다음과 같은 것을 시도했지만 구문을 만들 수는 없다.

select column1, column2, column3, explode(Map('X1':X1, 'X2':X2, ..))

누군가이 작품을 만드는 방법을 정확하게 지적 할 수 있습니까 ?? 나는 내 자신의 UDTF를 굴릴 수 있다고 생각하지만, 이것이 꽤 표준이되기를 바라고 있는가?

편집하다: stackoverflow에 비슷한 질문이 제기되었지만 배합이 복잡하고 제 의견으로는 잘못된 답변이 현재 정답으로 표시되어있는 경우가 있습니다. 나는이 질문이 더 숙고되고 요점에 있다고 생각한다.

해결법

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

    1.이걸 서둘러 게시했습니다. 나는 대답을 가지고있다. 이것을 유용하게 사용할 수있는 사람들을 위해 여기에 게시하십시오. 이것을 달성하기 위해지도를 다루고 폭발하는 정확한 구문이 있습니다.

    이걸 서둘러 게시했습니다. 나는 대답을 가지고있다. 이것을 유용하게 사용할 수있는 사람들을 위해 여기에 게시하십시오. 이것을 달성하기 위해지도를 다루고 폭발하는 정확한 구문이 있습니다.

    select column1, column2, column3, m_key, m_val from
        (select column1, column2, column3, map("X1", X1, "X2", X2, "X3", X3, "X4", X4) as map1
        from table1) as t1
    lateral view explode(map1) xyz as m_key, m_val    
    
  2. from https://stackoverflow.com/questions/38064412/converting-columns-to-rows-unpivot-in-hiveql by cc-by-sa and MIT license