假设我有一些示例数据行
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”字段,其中包含我想解析并在查询中使用的其他数据。
问题是,蜂巢中最好的方法是什么?
谢谢!
答案 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