2

假设我有一些示例数据行

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字符串)行格式分隔字段的表,以'^'终止;

如您所见,我要提取的 url 参数中有一些数据,即 datacoll=5|4|3|2|1

我还想使用由管道分隔的那些单个元素,以便我可以对它们进行分组,以显示例如有多少 url 的第二位置为“4”,在这种情况下为 2 行。所以在这种情况下,我有一个“url”字段,其中包含我想解析并在我的查询中使用的附加数据。

问题是,在蜂巢中做到这一点的最佳方法是什么?

谢谢!

4

2 回答 2

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'), '\|')

有了这个结果,您应该能够获取您想要的列。

有关更多内置函数,请参阅UDF 文档。

注意:我无法在我所在的 Hive 中验证这是否有效,如果有一些小问题,我很抱歉。

于 2012-04-19T11:12:53.193 回答
1

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

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

一旦你有了它,你就可以使用横向视图和内置的explode. 以下代码应该可以帮助您获取每列的 URL 计数。

select col, count(1) from clicklogs lateral view explode(datacol) dataTable as col group by col
于 2012-04-19T05:28:12.130 回答