3

我正在使用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); 

拆分时间字段后,我使用FILTERGROUP BYCOUNT UDF来查找上午 10 点和 11 点期间经常访问的前 3 个 url

输出:

(http://www.google.com,5)

(http://finance.yahoo.com,2)

(http://www.nada.com,2)

但是,我觉得必须有一种更简单的方法来使用 PIG UDF 作为regex_extractregex_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 的匹配函数为多个或一个都不适合。请使用显式演员表。

任何建议,我哪里出错了???

4

2 回答 2

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,我不记得了。两个都试试。

于 2013-08-19T12:44:10.900 回答
1

您的数据似乎格式正确,所以我想您可以使用以下表达式来匹配时间戳,注意它只会捕获组中的小时数。如果您需要时间戳的其他部分,只需用括号将其括起来( and )

\d{4}-\d{2}-\d{2}\s(\d{2}):\d{2}:\d{2} 
于 2013-08-19T11:09:04.067 回答