Pig - 使用正则表达式提取字符串

时间:2013-08-19 10:56:19

标签: regex apache-pig

我使用 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为多个或不适合。请使用明确的演员。

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

2 个答案:

答案 0 :(得分:4)

根据评论判断,您似乎混淆了REGEX_EXTRACTREGEX_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}