我正在使用pig来分析日志文件。
我的输入日志文件('/user/586376/Pig_C')看起来像这样。
12901890 \t玫瑰博客\t 2006-05-15 21:42:19 \t 1 \t http://www.rosie.com
A = load '/user/586376/Pig_C' as (ID:int, query:chararray, time:chararray, rank:int, url:chararray);
在这里,我想列出一天中以下时间经常访问的网站(前 3 个):上午 10 点到上午 11 点
目前,我在时间字段上使用 STRSPLIT 来提取所需的小时数。
Timesplit = FOREACH A GENERATE url, STRSPLIT(time,' ') as time_split;
B = FOREACH Timesplit GENERATE url, FLATTEN(time_split) as (date,time1);
C = FOREACH B GENERATE url, STRSPLIT(time1,':') as h;
final = FOREACH C GENERATE url,flatten(h) AS (hour,min,sec);
拆分时间字段后,我使用FILTER、GROUP BY和COUNT UDF来查找上午 10 点和 11 点期间经常访问的前 3 个 url
输出:
(http://www.google.com,5)
(http://finance.yahoo.com,2)
(http://www.nada.com,2)
但是,我觉得必须有一种更简单的方法来使用 PIG UDF 作为regex_extract和regex_extract_all而不是使用 STRSPLIT 来获取小时字段。但是我无法编写正则表达式来从给定的时间戳中提取所需的小时数。
现在有什么想法可以编写正则表达式以从给定的时间戳中查找小时数吗?
编辑:
在 pig 中编写了以下正则表达式来提取小时数:
data = FOREACH A GENERATE url, FLATTEN(EXTRACT(time,'\\d{4}-\\d{2}-\\d{2}\\s(\\d{2}):\\d{2}:\\d{2}')) AS (hour:chararray) ;
但是出现以下错误,
错误:
2013-08-19 18:20:28,745 [main] 错误 org.apache.pig.tools.grunt.Grunt - 错误 1045:无法推断 org.apache.pig.piggybank.evaluation.string.RegexExtract 的匹配函数为多个或一个都不适合。请使用显式演员表。
任何建议,我哪里出错了???