Как сделать двойной разделитель в 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

Я хочу создать такую ​​таблицу, чтобы создать журналы кликов таблицы (строка имени сайта, строка URL-адреса) поля с разделителями в формате ROW, заканчивающиеся символом '^';

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

Я также хочу работать с этими отдельными элементами, разделенными трубами, чтобы я мог группировать их, чтобы показать, например, сколько URL-адресов имеют вторую позицию «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