2015-09-17 3 views
2

У меня есть два таблицы следующим образом:улей - UNPIVOT функциональность в улье

Таблица 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 

Использование code_name в таблице A, я бы хотел чтобы найти соответствующее свойство_id из таблицы A в таблице B. В основном, сопоставление имени столбца в таблице B. Целью является получение соответствующего new_id.

Яблоки, манго, виноград и персики могут быть одинаковыми. Однако значения new_id будут уникальными.

Возможно ли это в улье? Кажется, в Hive нет никаких функциональных возможностей niviv/pivot.

Любая помощь будет действительно замечательной. Благодаря!

+0

ли вы когда-нибудь эта проблема решена? – gobrewers14

+1

Не могли бы вы пересмотреть выбранный вами правильный ответ. Подход, основанный на карте-взрыве, упомянутый GoBrewers14, является гораздо лучшим подходом. –

ответ

2

Если у вас есть только небольшое количество столбцов в таблице 2, можно вручную создать «unpivoted» таблицу как союз:

create table table2_unpivot as 
select mango_id as property_id, newid from table2 
union select grape_id as property_id, newid from table2 
union select peach_id as property_id, newid from table2; 
+0

Любопытно услышать рассуждения о том, как это было выбрано в качестве правильного ответа, поскольку оно даже не приближается к желаемому результату. – gobrewers14

10

Всякий раз, когда я хочу, чтобы повернуть таблицу в улье, я собираю key:value, а затем ссылаются на каждый ключ на следующем уровне, создавая новые столбцы. Это противоположность этому.

Запрос:

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 
+1

Это работает для меня. – Jeremy

+0

Это должно быть отмечено как правильный ответ. Отличная демонстрация карты и взрыв для таких проблем. Это гораздо лучший подход по сравнению с использованием UNIONS, особенно в улье, когда речь идет о больших задачах с уменьшением количества карт, выходящих из SQL. –

-3

Вы на самом деле не нужно 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 
Смежные вопросы