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_extract 및 regex_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) ;
그러나 다음과 같은 오류가 발생,
오류 :
는 시간을 추출하는 돼지에서 다음 정규식을 쓴 어디서 잘못 가고 있니?
정규 표현식을 로그 파일의'2006-05-15 21 : 42 : 19' 및 유사한 타임 스탬프와 일치시키고 구체적으로 시간을 추출 하시겠습니까? –