2012-08-30 2 views
1

우리는 PIG를 사용하여 서버 로그의 대용량 로그 분석을 목표로합니다. 파일에서 PIG 맵 데이터 유형을로드해야합니다.PIG CSV로드 맵 유형 오류

다음 데이터가있는 샘플 PIG 스크립트를 실행 해 보았습니다.

(돼지에 의해 처리되는) ​​'테스트'라는 이름의 내 CSV 파일의 라인이 보이는

,

151364,[ref#R813,highway#secondary] 

내 돼지 스크립트

아이디어는 int를로드하는 것입니다
a = LOAD 'test' using PigStorage(',') AS (id:INT, m:MAP[]); 
DUMP a; 

및 두 번째 요소는 해시 맵입니다. 그러나 내가 덤프 할 때 int 필드는 올바르게 구문 분석되고 덤프에 인쇄됩니다. 그러나 매핑 필드가 구문 분석되지 않아 구문 분석 오류가 발생합니다.

내가 누락 된 부분을 설명해 줄 수 있습니까?

답변

1

필자는 구분 기호와 관련된 문제가 있다고 생각합니다. 예를 들어 필드 구분 기호는지도 필드의 구문 분석에 영향을 미치거나지도 구분 기호와 혼동됩니다. 아래

151364;[ref#R813,highway#secondary] 

내 툴툴 쉘로부터 출력 :

이 입력 데이터를 사용하는 경우 (통지를 I 필드 구분자로 세미콜론 사용)

grunt> a = LOAD '/tmp/temp2.txt' using PigStorage(';') AS (id:int, m:[]); 
grunt> dump a; 
... 
(151364,[highway#secondary,ref#R813]) 

grunt> b = foreach a generate m#'ref'; 
grunt> dump b; 
(R813) 
1

Atlast, I는 상상 문제 해결. 디 리미터를 ','에서 다른 캐릭터로 변경하십시오. 예를 들어 파이프를 말하십시오. Source code

@Override 
public Tuple getNext() throws IOException { 
     for (int i = 0; i < len; i++) { 
      //skipping some stuff 
      if (buf[i] == fieldDel) { // if we find delim 
       readField(buf, start, i); //extract field from prev delim to current 
       start = i + 1; 
       fieldID++; 
      } 
     } 
} 

- 필드 구분 기호는지도 : 나는 또한 구문 분석 로직을 PigStorage 함수의 소스 코드에보고 및 확인

The string 151364,[ref#R813,highway#secondary] was getting parsed into, 
field1: 151364 field2: [ref#R813 field3: highway#secondary] 
Since '[ref#$813' is not a valid map field, there is a parse error. 

에 사용되는 구분자 ','와 혼동되고 있었다 따라서 PIG는 구분자로 필드를 분할하기 때문에 필드 구문 분석이 맵에 사용 된 구분 기호와 혼동됩니다.