我使用 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 A.M.到了11 A.M。
目前,Iam在时间字段上使用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);
分割时间字段后,Iam使用 FILTER , GROUP BY 和 COUNT UDF 在上午10点找到经常访问的前3个网址。和11 A.M。
输出:
(http://www.google.com,5)
(http://finance.yahoo.com,2)
(http://www.nada.com,2)
但是,我觉得必须有一种更简单的方法来使用PIG UDF获取小时字段 regex_extract 和 regex_extract_all 而不是使用STRSPLIT。但我无法编写正则表达式从提供的时间戳中提取所需的小时数。
现在有什么想法写正则表达式来查找给定时间戳的小时数吗?
编辑:
在猪身上写下以下正则表达式来提取时间:
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] ERROR org.apache.pig.tools.grunt.Grunt - 错误1045:无法推断org.apache.pig.piggybank.evaluation.string的匹配函数.RegexExtract为多个或不适合。请使用明确的演员。
任何建议,我哪里出错???
答案 0 :(得分:4)
根据评论判断,您似乎混淆了REGEX_EXTRACT
和REGEX_EXTRACT_ALL
的论点。由于您只需要提取一个部分,因此使用REGEX_EXTRACT
,它不返回元组,但需要另一个指定索引的参数:
data =
FOREACH A
GENERATE
url,
REGEX_EXTRACT(time, '\\d{4}-\\d{2}-\\d{2}\\s(\\d{2}):\\d{2}:\\d{2}', 1)) AS(hour:chararray);
REGEX_EXTRACT
的第三个参数可能应该是0而不是1,我不记得了。试试两个。
答案 1 :(得分:1)
您的数据似乎格式正确,所以我猜您可以使用以下表达式来匹配时间戳,请注意它只会捕获组中的小时数。如果您需要时间戳的其他部分,请使用括号( and )
围绕它。
\d{4}-\d{2}-\d{2}\s(\d{2}):\d{2}:\d{2}