2013-08-19 49 views
3

Iam使用pig來分析日誌文件。Pig - 使用正則表達式提取字符串

我的輸入日誌文件('/ user/586376/Pig_C')看起來像這樣。

12901890 \t rosies blog \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點

目前,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); 

分裂時間字段後,蔭使用FILTERGROUP BYCOUNT UDF發現上午10時在經常訪問的前3名的URL和上午11點

輸出:

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

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

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

但是,我覺得必須有獲得使用PIG UDF的爲regex_extractregex_extract_all,而不是使用STRSPLIT小時字段更簡單的方法。但Iam無法編寫正則表達式從給定的時間戳中提取所需的小時數。

任何想法現在寫正則表達式來查找給定時間戳的小時?

編輯:

寫了下面的正則表達式豬提取時間:

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 - ERROR 1045: Could not infer the matching function for org.apache.pig.piggybank.evaluation.string.RegexExtract as multiple or none of them fit. Please use an explicit cast.

任何建議,哪裏出錯?

+0

所以你想要一個正則表達式與你的日誌文件中的'2006-05-15 21:42:19'和類似的時間戳相匹配,並且明確地從中提取小時? –

回答

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,我可以不記得了。試試兩個。

+0

@WinnieNicklaus ....是的,那正是問題所在。我把2個UDF的參數混合起來,第三個參數是** 1 **。 – Ankita

+0

如果我必須提取所有其他參數,如年,日,分,秒和等。我應該使用REGEX_EXTRACT_ALL。我應該在現有代碼中做什麼修改? – Ankita

+0

使用'REGEX_EXTRACT_ALL',圍繞括號中的每個參數,像原來一樣使用'FLATTEN',然後提供模式。事實上,如果你使用了'REGEX_EXTRACT_ALL',你原來使用的代碼就可以正常工作了。 (我只是認爲對於提取單個組,REGEX_EXTRACT在概念上更有意義。) –

1

您的數據似乎格式良好,所以我想你可以使用下面的表達式來匹配時間戳,注意它只會捕獲組中的小時數。如果您需要時間戳的其他部分,請使用圓括號(and)將其包圍。

\d{4}-\d{2}-\d{2}\s(\d{2}):\d{2}:\d{2} 
+0

是的。你可以使用這個正則表達式來執行命令嗎? – Ankita

+0

@Ankita我很抱歉,因爲我不知道什麼是針腳,也不知道它的語法。 –