Есть ли способ перенести данные в Hive?

Можно ли транспонировать данные в Hive? Например, строки становятся столбцами, а столбцы строками? Если функции нет, есть ли способ сделать это за пару шагов?

У меня есть такая таблица:

 | ID   |   Names   |  Proc1   |   Proc2 |  Proc3  |
 | 1    |    A1     |   x      |   b     |  f      |
 | 2    |    B1     |   y      |   c     |  g      |
 | 3    |    C1     |   z      |   d     |  h      |
 | 4    |    D1     |   a      |   e     |  i      |

Я хочу, чтобы это было так:

 | A1   |   B1   |  C1   |   D1 |  
 | x    |    y   |   z   |   a  |
 | b    |    c   |   d   |   e  |
 | f    |    g   |   h   |   i  |

Я искал другие связанные вопросы, и все они упоминают об использовании боковых видов и взрыва, но есть ли способ выборочно выбирать столбцы для бокового (ли) просмотра (просмотра) и взрыва (расширения)?

Кроме того, каким может быть грубый процесс для достижения того, что я хотел бы сделать? Пожалуйста, помогите мне. Спасибо!

Изменить: я читал эту ссылку: https://cwiki.apache.org/Hive/languagemanual-lateralview.html, и он показывает мне половину того, чего я хочу достичь. Первый пример в ссылке в основном то, что мне нужно, за исключением того, что я не хочу, чтобы строки повторялись, и хочу, чтобы они были именами столбцов. Любые идеи о том, как привести данные к такой форме, что если я сделаю explode, это приведет к желаемому результату или наоборот, т.е. explode сначала приведет к другому шагу, который затем приведет к моей желаемой выходной таблице . Еще раз спасибо!


person CodingInCircles    schedule 04.09.2013    source источник


Ответы (2)


Я не знаю, как сделать это из коробки в улье, извините. Вы приближаетесь к взрыву и т. Д., Но я не думаю, что это может выполнить свою работу.

В целом, концептуально, я думаю, что трудно транспонировать, не зная заранее, какими будут столбцы целевой таблицы. Это верно, в частности, для улья, потому что метаданные связаны с количеством столбцов, их типами, их именами и т. д. в базе данных — хранилище метаданных. И в целом это правда, потому что, не зная заранее столбцы, потребуется какое-то хранение данных в памяти (хорошо, конечно, с разливами), и пользователям, возможно, придется быть осторожными, чтобы не переполнить память и тому подобное (точно так же, как динамические разделение в улье).

В любом случае, короче говоря, если вы заранее знаете столбцы целевой таблицы, жизнь удалась. Насколько мне известно, в hive нет команды set как таковой, но вы можете использовать кучу предложений if и операторов case (некрасиво, я знаю, но я делал то же самое в прошлом) в предложение select для переноса данных. Что-то вроде SQL - Как транспонировать?

Дай мне знать, как дела!

person Mark Grover    schedule 10.09.2013
comment
Спасибо Марк, за ответ. Да, у меня есть имена столбцов и, по сути, вся таблица, подготовленная заранее. Я просто хочу, чтобы столбцы 2–61 переносились в новую таблицу без потери отношения/порядка. Я обязательно рассмотрю операторы if и case. Пожалуйста, дайте мне знать, если у вас есть дополнительные мысли. Спасибо! - person CodingInCircles; 10.09.2013
comment
Привет, Марк.. В ссылке, на которую вы мне указали, написано t.fieldname и t.fieldvalue. Как получить доступ к этим свойствам в Hive? Любые идеи? Спасибо! - person CodingInCircles; 11.09.2013
comment
Я не думаю, что вы можете получить к ним доступ, они хранятся в базе данных метахранилища. - person Lorand Bendig; 11.09.2013
comment
Действительно, Лоранд прав. Я бы просто жестко закодировал их (т.е. имена столбцов исходной таблицы) в вашем запросе. - person Mark Grover; 11.09.2013
comment
Подход MySQL (с использованием MAX, CASE, GROUP BY) отлично работает в Hive. Спасибо! - person Michal Čizmazia; 04.07.2014

Как отметил Марк, в Hive нет простого способа сделать это, поскольку PIVOT не t присутствует в Hive, и вы также можете столкнуться с проблемами при попытке использовать случай / когда «трюк», поскольку у вас есть несколько значений (proc1, proc2, proc3).

Что касается целей тестирования, вы можете попробовать другой подход:

select v, o1, o2, o3 from (
  select k, 
         v,
         LEAD(v,3) OVER() as o1,
         LEAD(v,6) OVER() as o2,
         LEAD(v,9) OVER() as o3
  from (select transform(name,proc1,proc2,proc3) using 'python strm.py' AS (k, v) 
    from input_table) q1
) q2 where k = 'A1';

где strm.py:

import sys

for line in sys.stdin:
  line = line.strip()
  name, proc1, proc2, proc3 = line.split('\t')
  print '%s\t%s' % (name, proc1)
  print '%s\t%s' % (name, proc2)
  print '%s\t%s' % (name, proc3)

Хитрость здесь заключается в использовании скрипта Python на этапе карты, который выделяет каждый столбец строки как отдельные строки. Тогда каждая третья (поскольку у нас есть 3 столбца proc) строка будет формировать результирующую строку, которую мы получим, заглянув вперед (лид).

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

person Lorand Bendig    schedule 11.09.2013
comment
3 был просто для иллюстративных целей. Скорее 60! :) Спасибо за Ваш ответ. Я проверю это и сообщу вам через несколько дней. Прямо сейчас я использую карту и несколько боковых видов, чтобы как бы добраться до цели. Я попробую это. Большое спасибо! :) - person CodingInCircles; 12.09.2013