2012-03-27 3 views
1

문자열의 일부를 추출하고 hbase에 열에 저장하려고합니다.PIG에서 Hbase로 일부 필드를 저장하십시오.

파일 내용 : MSGTYPE에 해당하는 메시지의

msgType1 Person xyz has opened Internet:www.google.com from IP:192.123.123.123 for duration 00:15:00 

msgType2 Person xyz denied for opening Internet:202.x.x.x from IP:192.123.123.123 reason:unautheticated 

msgType1 Person xyz has opened Internet:202.x.x.x from IP:192.123.123.123 for duration 00:15:00 

패턴이 고정됩니다. 이제 hbase에 사람 이름, 대상, 소스, 기간 등을 저장하려고합니다.

나는이 작업을 수행하기 위해 PIG에서 스크립트를 작성하려고합니다. 하지만 부분 추출 중입니다. (문자열에서 'Internet : 202.x.x.x'토큰에서 IP 또는 웹 사이트 이름을 추출하십시오.)

정규 표현식을 사용해 보았지만 제대로 작동하지 않았습니다.

ERROR 1045: Could not infer the matching function for org.apache.pig.builtin.REGEX_EXTRACT as multiple or none of them fit. Please use an explicit cast. 

이 값을 추출하고 돼지보다 돼지 또는에서 HBase를 다른를 저장할 수있는 다른 방법이 : 정규식은 항상 곁에이 오류를 던져?

답변

1

어떻게 REGEX_EXTRACT 기능을 사용합니까? REGEX_EXTRACT_ALL 함수를 보셨습니까? 문서 (http://pig.apache.org/docs/r0.9.2/func.html#regex-extract-all)에 따르면, 그것은 다음과 같이해야합니다 :

test = LOAD 'test.csv' USING org.apache.pig.builtin.PigStorage(',') AS (key:chararray, value:chararray); 
test = FOREACH test GENERATE FLATTEN(REGEX_EXTRACT_ALL (value, '(\\S+):(\\S+)')) as (match1:chararray, match2:chararray); 
DUMP test; 

내 파일은 같다 :

1,a:b 
2,c:d 
3, 
+0

난 정규식처럼 사용할 및 기타 많은 변형이 있습니다. – pradeep

+0

A = LOAD 'yourfile'USING PigStorage ('\ t') AS (key : chararray, message : chararray); B = foreach A는 REGEX_EXTRACT (메시지, '인터넷 : *')를 생성합니다. – pradeep

+0

B = FOREACH 생성 REGEX_EXTRACT_ALL (f1, '(. *) \ : (. *)') AS 사용 (match1 : chararray, match2 : chararray); 오류가 발생합니다. ERROR 1000 : 구문 분석하는 동안 오류가 발생했습니다. "\ '(. *) \\" 로그 파일의 세부 정보 :/home/pig_1.로그 및 사용 B = FOREACH 생성 REGEX_EXTRACT_ALL (f1, '(. *) : (. *)') AS (match1 : chararray, match2 : chararray); 오류가 발생합니다. - ERROR 1000 : 구문 분석하는 동안 오류가 발생했습니다. 1 행 67 열에서 ""이 (가) 발생했습니다. 로그 파일 세부 정보 : /home/pig_1.log – pradeep

1

나는 게으르며 단계를 밟지 않아도되지만 실제로 여기에 user-defined function을 사용해야합니다. 돼지는 데이터 흐름 언어로서 좋으며 그 밖의 것은별로 없으므로 최대한의 힘을 얻으려면 많은 UDF를 사용하여 텍스트를 탐색하고 더 복잡한 작업을 수행해야합니다.

UDF는 단일 문자열을 매개 변수로 사용하고 (person, destination, source, duration)을 나타내는 튜플을 반환합니다. 그것을 사용하려면, 당신은 할 수 있습니다 :

A = LOAD ... 
... 
B = FOREACH A GENERATE MyParseUDF(logline); 
... 
STORE B INTO ... 

당신은 HBase를 행 키가 무엇인지 언급,하지만 그것을 저장하기 전에 관계의 첫 번째 요소 확실하지 않았다.

+0

UDF를 시도했지만 UDF를 실행하는 동안 내 UDF가 적절하게 작동하지 않았습니다. 그루트는 항상 약간의 오류가 발생합니다. – pradeep

+0

일부 결과가 hbase에 저장 될 수있는 Bag {(xyz), (Internet : www.google.com), (IP : 192.123.123.123)}에 반환되었습니다. 나는 돼지를 사용하고 있습니다. - 0.8.1 CDH3 버전 – pradeep

+0

이 문장을 얻지 못했습니다. "하지만 관계를 저장하기 전에 관계의 첫 번째 요소인지 확인하십시오." (메시지의 인터넷 * ') E = foreach는 D가 REGEX_EXTRACT 생성 : 및 : E = foreach는 D가 REGEX_EXTRACT 생성 (메시지의 인터넷 *'를 2) 을 ... – pradeep

관련 문제