2016-03-31 6 views
0

Im пытается выбрать различные значения из каждого столбца внутри данной таблицы. В моем запросе не хватает производительности из-за создания многих MapReduce Jobs, и они ищут лучшее решение.Выберите различные значения из каждого столбца в Hive

Моя таблица содержит следующие значения:

last_30: a 
last_90: a, b, a  
last_180: b, c 

Нужный результат будет следующим:

last_30#a 
last_90#a 
last_90#b 
last_180#b 
last_180#c 

с помощью следующего запроса я получить желаемый результат, не очень производительный, хотя из-за он несколько раз проходит через стол:

SELECT distinct concat('last_30', exploded_last_30.key) 
FROM table 
LATERAL VIEW explode(last_30) exploded_last_30 AS key 
UNION ALL 
SELECT distinct concat('last_90', exploded_last_90.key) 
FROM table 
LATERAL VIEW explode(last_90) exploded_last_90 AS key 
UNION ALL 
SELECT distinct concat('last_180', exploded_last_180.key) 
FROM table 
LATERAL VIEW explode(last_180) exploded_last_180 AS key 

Можете ли вы подумать о fa чтобы создать желаемый результат?

Greets

::: Обновление :::

Используя свое решение я придумал следующий запрос:

select distinct * 
    from (
     select explode(map_keys(map(
             concat('firstname#',a.exploded_firstname), '1', 
             concat('lastname#', a.exploded_lastname), '1', 
             concat('gender#', a.exploded_gender), '1', 
             concat('last_30#', a.exploded_last_30), '1', 
             concat('last_90#', a.exploded_last_90), '1' 
            ) 
           ) 
        ) 
     from (
       select 
       exploded_firstname.key as exploded_firstname, 
       exploded_lastname.key as exploded_lastname, 
       exploded_gender.key as exploded_gender, 
       exploded_last_30.key as exploded_last_30, 
       exploded_last_90.key as exploded_last_90 
       from table 
       LATERAL VIEW explode(firstname) exploded_firstname AS key, value 
       LATERAL VIEW explode(lastname) exploded_lastname AS key, value 
       LATERAL VIEW explode(gender) exploded_gender AS key, value 
       LATERAL VIEW explode(last_30) exploded_last_30 AS key 
       LATERAL VIEW explode(last_90) exploded_last_90 AS key 
     ) as a 
    ) as b; 

еще сталкивается с двумя проблемами, хотя:

  • Я не описал проблему в полном объеме, данные образца I предоставили только примитивные типы данных. В реальной таблице присутствуют Карты и Массивы. Нажатие массива или карты только , содержащий «NULL» Значение не будет возвращать не выход на все
  • Во-вторых, добавление дополнительных полей на этот запрос, компилятор от создания MapReduce Джобсу выполнить запрос. Вот MapReduce раз в течение 14 и 15 полей соответственно:

    Total MapReduce CPU Time Spent: 26 seconds 60 msec 
    OK 
    Time taken: 142.896 seconds 
    
    Total MapReduce CPU Time Spent: 29 seconds 310 msec 
    OK 
    Time taken: 257.807 seconds 
    

Как вы можете видеть Total MapReduce время приблизительно линейным, а общее время увеличивается значительно. Вы, ребята, посоветовали по этим двум вопросам?

ответ

0

Союз заставит многократные чтения таблицы. Чтобы этого избежать, вы можете использовать карты для дедупликации данных одной строки, а затем взорвать ее (это приведет к повороту ваших данных). Для дедупликации используйте значения столбцов в качестве ключей карты и константу для значения карты.

Если нет повторяющихся значений между строками, то это будет одна операция сканирования:

select explode(map_keys(map(concat(customer_id, '#', customer_fname), '1' 
      , concat(customer_id, '#', customer_lname), '1' 
      , concat(customer_id, '#', customer_email), '1' 
      , concat(customer_id, '#', customer_street), '1' 
      , concat(customer_id, '#', customer_city), '1' 
      , concat(customer_id, '#', customer_state), '1' 
      , concat(customer_id, '#', customer_zipcode), '1' 
    ))) from customers 

Если есть дубликаты, производимые различных строки, а затем добавить различен, но это заставит снизить стадию и будет медленнее.

Также карты могут использоваться для поворота данных: D

Смежные вопросы