2013-04-02 4 views
1

나는 그 내용이 다음과 같이 로그 파일을 읽기 위해 노력하고 함께 공백으로 구분 된 파일 읽기 :는 돼지

2013-03-28T12 : 19 : 03.639648-05 : 00 host1의의 rpcbind를 : rpcbind를가에 종료 신호. "rpcbind -w"로 다시 시작
2013-03-28T12 : 20 : 33.158823-05 : 00 host2 rpcbind : rpcbind가 신호로 종료됩니다. 로 다시 시작 "rpcbind를 -w"

내가 이렇게 같은 PigStorage 공간 구분 기호 사용하여 시도했다 : (날짜로

cmessages = LOAD 'data.txt로'사용 PigStorage를 ('') : chararray, 호스트 : chararray, message : chararray);

하지만 세 번째 필드에서 메시지가 삭제되므로 나중에 유용하다고 생각됩니다.

덤프 cmessages;

<snip> 
(2013-03-28T12:19:03.639648-05:00,host1,rpcbind:) 
(2013-03-28T12:20:33.158823-05:00,host2,rpcbind:) 
</snip> 

비용이 많이 드는 정규 표현식 또는 UDF 로더를 필요로하지 않는이 로그 파일에 읽을 수있는 더 좋은 방법이 있나요? 돼지에는 두 번째 공간이 끝난 후 멈추라 고하는 뭔가가 있어야할까요? 아마.

업데이트 : 19 : 03.639648-05 : 00, host1의, rpcbind를 :)

I 대신

(2013-03-28T12의 : 그냥 내가 원하는 개정 거라고 같은

(2013-03-28T12 : 19 : 03.639648-05 : 00 host1의, 다음 rpcbind : rpcbind를 신호의 종료 "rpcbind를 -w"재시작.)

,536,

기본적으로 튜플의 마지막 필드에 전체 로그 메시지가 필요합니다. 그게 더 분명해지기를 바랍니다.

답변

1

날짜와 호스트가 고정 된 길이가 있다고 가정하면, 다음과 같은 사용할 수 있지만, 로그를 제어 정확히 규칙을 모른 채 완벽한 해결책이 없다 :

A = load 'mydata' as (log:charray); 
B = foreach A generate SUBSTRING(name, 0, 31) AS date, 
         SUBSTRING(name, 33, 37) AS host, 
         SUBSTRING(name, 39, 255) AS message; 

하는 것은 그들 만 알고하는 경우 처음 2 공백으로 구분되는 다음을 사용할 수

A = load 'mydata' as (log:charray); 
B = foreach A generate log, INDEXOF(log, ' ', 0) as index; 
C = foreach B generate log, index, INDEXOF(log, ' ', index + 1) AS index2; 
D = foreach C generate SUBSTRING(log, 0, index) AS date, 
         SUBSTRING(log, index + 1, index2) as host, 
         SUBSTRING(log, index2+1, 255) as message; 

당신은 로그에 관한 "규칙"을 알고 다음 적절한 방법을 선택해야합니다. 여기에서는 또한 가장 긴 로그 길이가 256 자라고 가정합니다.

+0

댓글 섹션의 댓글이어야합니다. –

+0

알기는하지만 그렇게할만한 가치가 없기 때문에 나는 할 수 없습니다. 그리고 잘못된 곳에서 세부 사항을 묻는 것은 --- IMHO --- 나는 아마도이 사람을 도울 수 있다는 것을 알고, 어떤 것도 대답하지 않는 것보다 낫습니다. – ATN

+0

Ah 대신 (2013-03-28T12 : 19 : 03.639648-05 : 00, host1, rpcbind :) 튜플의 마지막 입력란에 포함 된 전체 메시지를 원합니다. (2013-03-28T12 : 19 : 03.639648-05 : 00, host1, rpcbind : rpcbind 신호를 통해 종료."rpcbind -w"로 다시 시작하십시오.) – user2234361