Как эффективно отключить НЕСКОЛЬКО колонок в Hive? - PullRequest
0 голосов
/ 20 ноября 2018

Мои данные структурированы, как показано в таблице ниже:

| Name | Foo_A | Foo_B | Foo_C | Bar_A | Bar_B | Bar_C |
--------------------------------------------------------
| abcd |    16 |    32 |    14 |    52 |    41 |    17 |
| ...  |   ... |   ... |   ... |   ... |   ... |   ... |

Я пытаюсь запросить данные в Hive таким образом, чтобы они выглядели так:

| Name | Class | FooVal | BarVal |
----------------------------------
| abcd | A     |     16 |     52 |
| abcd | B     |     32 |     41 |
| abcd | C     |     14 |     17 |
| ...  | ...   |    ... |    ... |

Я уже знаю и использую UNION ALL, но что может быть более эффективным способом сделать это, используя "LATERAL VIEW explode" для типа данных карты?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Спасибо за ответ!Ниже вы найдете другой способ сделать это быстрее, чем CROSS JOIN.

    select t1.ID, t2.key_1 as class, t2.FooVal, t3.BarVal
    from table t1
    LATERAL VIEW explode (map(
   'A', Foo_A,
   'B', Foo_B,
   'C', Foo_C
    )) t2 as key_1, FooVal
    LATERAL VIEW explode (map(
    'A', Bar_A,
    'B', Bar_B,
    'C', Bar_C
     )) t3 as key_2, BarVal
     where t2.key_1 = t3.key_2;
0 голосов
/ 20 ноября 2018

CROSS JOIN с class stack (см. Пример кода) будет умножать строки основной таблицы x3, одну строку на class, а затем использовать операторы case для получения столбцов в зависимости от значения class.CROSS JOIN с небольшим набором данных (3 строки) должен быть преобразован в map join и будет очень быстро выполняться на мапперах.

set hive.auto.convert.join=true; --this enables map-join

select t.Name,
       s.class,
       case s.class when 'A' then t.Foo_A 
                    when 'B' then t.foo_B
                    when 'C' then t.foo_C
        end as FooVal,
       case s.class when 'A' then t.Bar_A 
                    when 'B' then t.Bar_B
                    when 'C' then t.Bar_C
        end as BarVal              
 from table t 
      cross join (select stack(3,'A','B','C') as class) s
;

Он будет сканировать таблицу только один раз и работать намного лучше, чемСОЮЗ ВСЕХ подход.

...