복붙노트

[SQL] 하이브 - 하이브에서 피벗 기능

SQL

하이브 - 하이브에서 피벗 기능

다음과 같이 저는 두 테이블이 있습니다 :

표 A

userid | code | code_name | property_id
0001   | 1    | apple_id  | Y1234
0031   | 4    | mango_id  | G4567
0008   | 3    | grape_id  | H1209
00013  | 2    | peach_id  | Z5643

표 2

apple_id | mango_id | grape_id | peach_id | new_id
Y1234    |  R1890   |          |          | N456098
         | G4567    |          |  B3490   | N002345
T3336    |          | H1209    |  F3467   | N129087
         |  D7865   | J6543    |  Z5643   | N109876

원하는 결과 테이블

userid | new_id
0001   | N456098
0031   | N002345
0008   | N129087
00013  | N109876

표 A에서 CODE_NAME을 사용하여, 나는 기본적으로 표 B에 표 A에서 각각 PROPERTY_ID을 찾을 표 B. 목적의 열 이름과 일치하고 싶은 것은 해당 NEW_ID를 얻는 것입니다.

애플, 망고, 포도, 복숭아 ID는 동일 할 수 있습니다. 그러나 NEW_ID 값은 고유해야합니다.

이 하이브에서 수 있습니까? 하이브의 모든 UNPIVOT / 피벗 기능이있을 것 같지 않습니다.

어떤 도움이 정말 좋은 것입니다. 감사!

해결법

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

    1.지도에 값 쌍 다음 새 열을 만들고, 다음 단계의 각 키를 참조 : 나는 하이브에서 테이블을 피벗 할 때마다, 나는 키를 수집합니다. 이것은 그 반대입니다.

    지도에 값 쌍 다음 새 열을 만들고, 다음 단계의 각 키를 참조 : 나는 하이브에서 테이블을 피벗 할 때마다, 나는 키를 수집합니다. 이것은 그 반대입니다.

    질문:

    select a.userid, y.new_id
    from (
      select new_id, fruit_name, fruit_code
      from (
        select new_id, map("apple_id", apple_id
                         , "mango_id", mango_id
                         , "grape_id", grape_id
                         , "peach_id", peach_id) as fruit_map
        from table_2 ) x
      lateral view explode(fruit_map) exptbl1 as fruit_name, fruit_code ) y
    join table_A a
    on (y.fruit_code=a.property_id)
    

    산출:

    0001    N456098
    0031    N002345
    0008    N129087
    00013   N109876
    
  2. ==============================

    2.결과를 얻을 수 UNPIVOT에 당신 실제로 해달라고해야합니다.

    결과를 얻을 수 UNPIVOT에 당신 실제로 해달라고해야합니다.

    SELECT * FROM 
    (
        SELECT userid,
            CASE WHEN property_id = apple_id THEN new_id  
                 WHEN property_id = mango_id THEN new_id  
                 WHEN property_id = grape_id THEN new_id  
                 WHEN property_id = peach_id THEN new_id
            END AS newid
        FROM
        (SELECT * FROM a FULL JOIN b) X
    ) y
    WHERE newid IS NOT NULL;
    

    결과:

    y.userid  y.newid
    1         N456098
    31        N002345
    8         N129087
    13        N109876
    
  3. from https://stackoverflow.com/questions/32621970/hive-unpivot-functionality-in-hive by cc-by-sa and MIT license