Кортеж подсчета улья?

Я новичок в HiveQL, и я немного застрял: S

У меня есть таблица следующей схемы. Один столбец с именем res и три разделенных на разделы столбца partion_column с именем filed.

create table results( res string) PARTITIONED BY (field STRING); 

Затем я импортировал данные в эту таблицу

insert overwrite table results PARTITION (field= 'title') SELECT  explode(line) AS myNewCol FROM titles ;
insert overwrite table results PARTITION (field= 'artist') SELECT  explode(line) AS myNewCol FROM artist;
insert overwrite table results PARTITION (field= 'albums') SELECT  explode(line) AS myNewCol FROM albums;

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

Например, эта команда подсчитывает количество существования определенных заголовков в наборе данных.

 SELECT res, count(1) AS counttotal   FROM results where field='title' GROUP BY res ORDER BY counttotal;

и выводит что-то вроде

 title                                count        
 Hit me Baby More time                   9

Как я могу распространить это на кортежи (название, альбом, исполнитель)? Если я хочу получить вывод, например:

title                            album                 artist       count

Baby one more time    hit me baby one more time    britney spears    9

Весь мой код:

CREATE EXTERNAL TABLE IF NOT EXISTS hivetesttable  (
xmldata STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
location '/user/sdasd/hivetestdata/';

create view xmlout(line) as  select * from hivetesttable;  

CREATE VIEW TITLES(line) as select xpath(line,'/MC/SC/*/@ttl')  from xmlout;
CREATE VIEW ARTIST(line) as select  xpath(line,'/MC/SC/*/@art')  from xmlout;
CREATE VIEW ALBUMS( line) as select   xpath(line,'/MC/SC/*/@art') from xmlout;



create table results( res string) PARTITIONED BY (field STRING); 
insert overwrite table results PARTITION (field= 'title') SELECT  explode(line) AS myNewCol FROM titles ;
insert overwrite table results PARTITION (field= 'artist') SELECT  explode(line) AS myNewCol FROM artist;
insert overwrite table results PARTITION (field= 'albums') SELECT  explode(line) AS myNewCol FROM albums;

SELECT res, count(1) AS counttotal   FROM results where field='title' GROUP BY res ORDER BY counttotal;

строка данных xml похожа на

<?xml version="1.0" encoding="UTF-8"?><MC><SC><S uid="2" gen="" yr="2011" art="Samsung" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Samsung/Music" alb="Samsung" ttl="Over the horizon"/><S uid="37" gen="" yr="2010" art="Jason Derulo" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Music/Jason Derulo/Jason Derulo" alb="Jason Derulo" ttl="Whatcha Say"/><S uid="38" gen="" yr="2010" art="Jason Derulo" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Music/Jason Derulo/Jason Derulo" alb="Jason Derulo" ttl="In My Head"/><S uid="39" gen="" yr="2011" art="Alexandra Stan" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Music/Alexandra Stan/Mr_ Saxobeat - Single" alb="Mr. Saxobeat - Single" ttl="Mr. Saxobeat (Extended Version)"/><S uid="40" gen="" yr="2011" art="Bushido" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Music/Bushido/Jenseits von Gut und Böse (Premium Edition)" alb="Jenseits von Gut und Böse (Premium Edition)" ttl="Wie ein Löwe"/><S uid="41" gen="" yr="2011" art="Bushido" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Music/Bushido/Jenseits von Gut und Böse (Premium Edition)" alb="Jenseits von Gut und Böse (Premium Edition)" ttl="Verreckt"/><S uid="42" gen="" yr="2011" art="Lucenzo" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/Music/Lucenzo/Danza Kuduro (feat_ Don Omar) [From _Fast &amp; Furious 5_] - Single" alb="Danza Kuduro (feat. Don Omar) [From &quot;Fast &amp; Furious 5&quot;] - Single" ttl="Danza Kuduro (feat. Don Omar) [From &quot;Fast &amp; Furious 5&quot;]"/><S uid="121" gen="" yr="701" art="Michael Jackson" cmp="&lt;unknown&gt;" fld="/mnt/sdcard/external_sd/Music/Michael Jackson/Bad [Bonus Tracks]" alb="Bad [Bonus Tracks]" ttl="Voice-Over Intro/Quincy Jones Interview #1 [*]"/></SC><PC/></MC>

person user1309258    schedule 21.03.2013    source источник
comment
хм, вы пытались решить это и в каком-то другом посте. Со своей стороны, я бы посоветовал вам объединить 3 таблицы с названиями, исполнителями и альбомами, а затем запросить нужные вам данные. Я так, как вы представили, не вижу возможности подключить данные :/. КСТАТИ ГЛ!   -  person www    schedule 22.03.2013


Ответы (1)


Судя по предоставленной вами информации, желаемый результат невозможен. Прямо сейчас у вас есть таблица, которая выглядит так:

res                           field
---                           -----
baby one more time            title
baby one more time            title
baby one more time            title
baby one more time            title
baby one more time            title
baby one more time            title
baby one more time            title
baby one more time            title
baby one more time            title
hit me baby one more time     album
hit me baby one more time     album
hit me baby one more time     album
hit me baby one more time     album
hit me baby one more time     album
hit me baby one more time     album
hit me baby one more time     album
hit me baby one more time     album
hit me baby one more time     album
britney spears                artist
britney spears                artist
britney spears                artist
britney spears                artist
britney spears                artist
britney spears                artist
britney spears                artist
britney spears                artist
britney spears                artist
the distance                  title
the distance                  title
open book                     title
daria                         title
fashion nugget                album
fashion nugget                album
fashion nugget                album
fashion nugget                album
cake                          artist
cake                          artist
cake                          artist
cake                          artist

Поскольку вы разделили его, Hive хранит его в трех разных папках, но это не влияет на результаты запроса. Я добавил несколько дополнительных дорожек, и я думаю, что с дополнительными дорожками вы хотели бы получить результат (поправьте меня, если я ошибаюсь):

title                  album                       artist              count
baby one more time     hit me baby one mroe time   britney spears      9
the distance           fashion nuggets             cake                2
open book              fashion nuggets             cake                1
daria                  fashion nuggets             cake                1

Но нельзя сказать, что «открытая книга» имеет какое-либо отношение к «модным наггетсам» или «торту», ​​так же как нельзя сказать, что «еще раз, детка» связана с «Бритни Спирс». Вы можете попытаться сопоставить по пунктам, но тогда вы получите что-то вроде этого

title                  album                       artist              count
baby one more time     hit me baby one more time   britney spears      9
null                   fashion nuggets             cake                3
the distance           null                        null                1
open book,daria        null                        null                1

Я думаю, вам нужна таблица с такими столбцами

title                  album                         artist
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
baby one more          hit me baby one more time     britney spears
the distance           fashion nuggets               cake
the distance           fashion nuggets               cake
open book              fashion nuggets               cake
daria                  fashion nuggets               cake

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


РЕДАКТИРОВАТЬ, КАК ОБЕЩАЕТСЯ:

Хорошо, создать таблицу без каких-либо разделов несложно:

CREATE TABLE results (title string, album string, artist string)

Создать таблицу с разделами почти так же просто, вам просто нужно сначала решить, на чем разбивать. Если вы разбиваете по исполнителям, это означает, что вы можете выполнять запросы, относящиеся к одному или нескольким исполнителям, без необходимости обрабатывать информацию о других исполнителях. Если вы разделяете по исполнителям и альбомам, вы можете сделать то же самое и с альбомами. Это происходит за счет разбиения большого файла на более мелкие файлы, и обычно MapReduce (и, следовательно, Hive) лучше работает с большими файлами. Я бы вообще не беспокоился о разбиении, если только вы не имеете дело как минимум с 10 ГБ и не чувствуете, что разбираетесь в том, как работает разбиение и HiveQL в целом. Но для полноты разбивка по исполнителям:

CREATE TABLE results (title string, album string) PARTITIONED BY (artist string);

и разбиты по исполнителям, а затем по альбомам. Разбиение на (artist string, album string) и (album string, artist string) не изменит ваших результатов, но вы должны поставить сначала логическую вершину иерархии.

CREATE TABLE (title string) PARTITIONED BY (artist string, album string);

Заполнение этой таблицы будет непростым, если единственная информация, к которой у нас есть доступ, находится в таблицах titles, artists, and albums, поскольку у нас есть огромный список заголовков, исполнителей и альбомов, но нет способа определить, например, какое название относится к какому альбому. Я надеюсь, что у вас есть данные, в которых эти отношения все еще не повреждены, или ваш набор данных все еще не поврежден. Не зная формы этих гипотетических данных, я не могу дать ответ, как заполнить ваши таблицы. Но если у вас есть секционированные таблицы, этот ответ может быть полезен вам, если вы не хотите вручную указывать каждого исполнителя и альбом (поскольку у каждого исполнителя есть собственный раздел, а внутри раздела каждый альбом получает свой собственный раздел).

РЕДАКТИРОВАТЬ: у спрашивающего есть xml-файлы, в которых сохранены отношения title, ablum, arist. Подробнее об этом в комментариях.

Теперь суть вопроса заключается в подсчете уникальных кортежей. Это будет одинаковым независимо от того, как данные были разделены, если вообще были. Мы делаем это с помощью предложения GROUP BY. Когда вы указываете один столбец (или раздел, который можно рассматривать как столбец со специальными свойствами), вы разбиваете данные на группы, которые имеют разные значения для этого столбца. Если вы указываете несколько столбцов, вы разбиваете данные на группы с разными значениями для комбинации столбцов. Это то, что мы используем для подсчета различных кортежей:

SELECT title, album, artist, COUNT(*)
FROM results
GROUP BY title, album, artist

и вот мы:

title                  album                       artist              count
baby one more time     hit me baby one mroe time   britney spears      9
the distance           fashion nuggets             cake                2
open book              fashion nuggets             cake                1
daria                  fashion nuggets             cake                1
person Daniel Koverman    schedule 21.03.2013
comment
Спасибо Даниэль. Да, я хотел, чтобы моя таблица выглядела так, как вы упомянули выше в конце своего ответа. Что вы предлагаете изменить в моем коде, чтобы избавиться от разбиения. Я добавил свой полный код в вопрос выше. - person user1309258; 22.03.2013
comment
Можно ли вводить данные в столбец вместо разделов? вставить результаты перезаписи таблицы РАЗДЕЛ (поле = 'название') ВЫБЕРИТЕ взорваться (строка) AS myNewCol FROM titles ; - person user1309258; 22.03.2013
comment
Вы можете сделать что-то вроде INSERT INTO results SELECT explode(line), null, null FROM titles, используя [боковой вид]9https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LateralView), но у меня нет опыта работы с боковыми видами, поэтому я мало чем могу помочь. У вас будут нули для других столбцов. Если вы хотите правильно заполнить все столбцы, вам нужно сначала их соединить. Имея только таблицы, представляющие собой список треков, альбомов и исполнителей, невозможно узнать, какие треки сочетаются с каким альбомом и т. д. Есть ли у вас доступ к данным с сохранением этих взаимосвязей? - person Daniel Koverman; 22.03.2013
comment
Что ж, Даниэль, я пробовал с боковым видом, но безуспешно. Я считаю, что JOIN - это путь. Я добавил одну строку XML, можете ли вы сказать мне, что вы думаете? - person user1309258; 22.03.2013
comment
Вы определенно должны создавать что-то со строками заголовков, альбомов, исполнителей прямо из xml и удалять таблицы заголовков, альбомов, исполнителей, которые у вас есть прямо сейчас. Я вижу два разумных подхода: сделать таблицу с помощью обработка hive xml, поскольку XML является структурированными данными, или обработайте XML-данные как полуструктурированные и преобразуйте их в удобный CSV-подобный плоский файл с помощью Pig или MapReduce, а затем импортируйте его в Hive. Не имея опыта использования Hive на XML, второй вариант кажется мне самым простым для импорта. - person Daniel Koverman; 22.03.2013
comment
Если вам нужен ответ о том, как получить эти XML-данные в таблицу Hive со столбцами = (название, альбом, исполнитель), вам, вероятно, следует опубликовать еще один вопрос, поскольку речь больше не идет о подсчете кортежей в улье. Заголовок должен быть похож на «Как импортировать XML-данные в Hive» или «Как импортировать XML-данные в Hive, используя атрибуты в качестве столбцов». - person Daniel Koverman; 22.03.2013
comment
Спасибо Даниэль. Я разместил еще один вопрос. Еще раз спасибо, вы очень помогли. - person user1309258; 23.03.2013
comment
Без проблем. Если у меня будет время, я постараюсь помочь вам в вашем следующем вопросе. ссылка здесь для удобства в будущем - person Daniel Koverman; 23.03.2013