2013-09-04 2 views
2

Можно ли транспонировать данные в улье? Как и в, строки становятся столбцами и столбцами являются строки? Если нет функции прямо вверх, есть ли способ сделать это за пару шагов?Есть ли способ транспонировать данные в 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 | 

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

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

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

ответ

2

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

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

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

Дайте мне знать, как все идет!

+0

Спасибо, Марк, за ответ. Да, у меня есть имена столбцов, и на самом деле вся таблица подготовлена ​​заранее. Я просто хочу, чтобы он переносил столбцы 2-61 в новую таблицу, не теряя отношения/порядка. Я обязательно рассмотрю инструкции 'if' и' case'. Пожалуйста, дайте мне знать, если у вас есть дополнительные мысли. Благодаря! – CodingInCircles

+0

Эй, Марк .. В ссылке, на которую вы указали, написано имя и поле. Как мы получаем доступ к этим свойствам в Hive? Есть идеи? Благодаря! – CodingInCircles

+0

Я не думаю, что вы можете получить к ним доступ, они хранятся в метасторе db –

1

Как отметил Марк, нет простого способа сделать это в Улье, так как PIVOT не присутствует в 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) 

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

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

+1

3 было только для иллюстративных целей. Это больше похоже на 60! :) Спасибо за Ваш ответ. Я проверю его и дам вам знать через несколько дней. Прямо сейчас, я использую карту и несколько боковых представлений, чтобы получить ее на полпути. Я попробую это. Большое спасибо! :) – CodingInCircles

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