如何在Hive中进行双分隔符?

时间:2012-04-19 04:49:43

标签: hadoop 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

我想创建一个这样的表 创建表单击日志(sitename string,url string) ROW格式分隔的字段以'^'终止;

正如你所看到的,我想要提取的url参数中有一些数据,即 Datacoll中= 5 | 4 | 3 | 2 | 1

我还想处理由管道分隔的那些单独的元素,因此我可以对它们进行分组显示例如有多少网址具有第二个位置“4”,在这种情况下将是2行。所以在这种情况下,我有“url”字段,其中包含我想解析并在查询中使用的其他数据。

问题是,蜂巢中最好的方法是什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

首先,使用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'), '\|')

结果,您应该能够获取所需的列。

有关更多内置函数,请参阅the UDF documentation

注意:我无法在Hive中验证这是否有效,如果有一些小问题,请对不起。

答案 1 :(得分:1)

这看起来与我几周前所做的非常类似,我认为在你的情况下最好的方法是应用预处理步骤(可能使用hadoop流),并将表的原型更改为是:

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

完成后,您可以使用横向视图和内置explode轻松操作Hive中的数据。以下代码可帮助您获取每个col的URL计数。

select col, count(1) from clicklogs lateral view explode(datacol) dataTable as col group by col