Как мога да направя двоен разделител в Hive?

да кажем, че имам някои примерни редове от данни

site1^http://article1.com?datacoll=5|4|3|2|1&test=yes
site1^http://article1.com?test=yes
site1^http://article1.com?datacoll=5|4|3|2|1&test=yes

Искам да създам таблица като така, създайте таблица clicklogs (низ име на сайт, низ URL адрес) ROW формат полета, разделени с разделители, завършващи с '^';

Както можете да видите, имам някои данни в url параметъра, който бих искал да извлека, а именно datacoll=5|4|3|2|1

Също така искам да работя с тези отделни елементи, разделени с тръби, за да мога да направя групови байове върху тях, за да покажа например колко URL адреса са имали 2-ра позиция на "4", което в този случай ще бъде 2 реда. Така че в този случай имам полето "url", което има допълнителни данни, които бих искал да анализирам и използвам в моите заявки.

Въпросът е какъв е най-добрият начин да направите това в кошера?

Благодаря!


person James    schedule 19.04.2012    source източник


Отговори (2)


Първо използвайте parse_url(string urlString, string partToExtract [, string keyToExtract]), за да вземете въпросните данни:

parse_url('http://article1.com?datacoll=5|4|3|2|1&test=yes', 'QUERY', 'datacol1')

Това връща '5|4|3|2|1', което ни стига по средата. Сега използвайте split(string str, string pat), за да разделите тези от всеки подразделител в масив:

split(parse_url(url, 'QUERY', 'datacol1'), '\|')

В резултат на това трябва да можете да вземете колоните, които искате.

Вижте документацията на UDF за повече вградени функции.

Забележка: Не успях да проверя дали това работи в Hive от мястото, където съм, съжалявам, ако има някои дребни проблеми.

person Donald Miner    schedule 19.04.2012

Това изглежда много подобно на нещо, което направих преди няколко седмици, мисля, че най-добрият подход във вашия случай би бил да приложите стъпка за предварителна обработка (вероятно с hadoop стрийминг) и да промените прототипа на вашата таблица, за да бъде:

create table clicklogs(sitename string, datacol Array<int>) row format delimited fields terminated by '^' collection items terminated by '|'

След като имате това, можете лесно да манипулирате вашите данни в Hive, като използвате странични изгледи и вградения explode. Следният код трябва да ви помогне да получите броя на URL адресите за колона.

select col, count(1) from clicklogs lateral view explode(datacol) dataTable as col group by col
person Charles Menguy    schedule 19.04.2012