2013-08-19 5 views
3

Iam 돼지을 사용하여 로그 파일을 분석합니다.돼지 - 정규식을 사용한 문자열 추출

내 입력 로그 파일 ('/ user/586376/Pig_C')은 다음과 같습니다. 오전 10시을 :

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을)를 자주 방문하는 사이트를 나열 할 11 A.M.

현재 시간 필드에서 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); 

시간 필드를 분할 한 후, 스피은 자주 오전 10시 중 3 위 URL의 방문 찾을 FILTER, 및 COUNT UDF BY GROUP을 사용하여 11 A.M.

출력 :

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

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

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

하지만, 난 돼지 UDF의 같은 regex_extractregex_extract_all를 사용하기보다는 STRSPLIT를 사용하여 시간 필드를 얻기 쉬운 방법이 있어야한다 생각합니다. 그러나 Iam은 주어진 타임 스탬프에서 필요한 시간을 추출하는 정규 표현식을 작성할 수 없습니다.

아이디어는 이제 정규 표현식을 작성하여 지정된 시간 소인에서 시간을 찾으십니까?

편집 :,

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.

어떤 제안 :

data = FOREACH A GENERATE url, FLATTEN(EXTRACT(time,'\\d{4}-\\d{2}-\\d{2}\\s(\\d{2}):\\d{2}:\\d{2}')) AS (hour:chararray) ; 

그러나 다음과 같은 오류가 발생,

오류 :

는 시간을 추출하는 돼지에서 다음 정규식을 쓴 어디서 잘못 가고 있니?

+0

정규 표현식을 로그 파일의'2006-05-15 21 : 42 : 19' 및 유사한 타임 스탬프와 일치시키고 구체적으로 시간을 추출 하시겠습니까? –

답변

4

는 의견으로 판단, 당신이 REGEX_EXTRACTREGEX_EXTRACT_ALL의 인수를 혼합되어 나타납니다. 내가 할 수있는,

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이어야한다 : 당신은 단지 한 부분을 추출해야하기 때문에 인덱스를 지정하는 또 다른 인수를 필요로 튜플을 반환하지 않는, REGEX_EXTRACT를 사용하지만,하지 기억하지 마. 그냥 둘 다 시도해보십시오.

+0

@WinnieNicklaus .... 네, 정확히 그게 문제였습니다. 나는 2 개의 UDF와 3 번째 인수의 주장을 뒤섞고있었습니다. ** 1 **. – Ankita

+0

내가 년, 일, 분, 초 등의 다른 모든 매개 변수를 추출해야한다면 cetra. 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 핀이 무엇인지 모르거나 문법을 알지 못해 죄송합니다. –

관련 문제