2012-10-06 4 views
2

돼지와 함께 플랫 파일을 어떻게 처리합니까? 예를 들어 처음 4 자리가 연도 인 레코드가있는 행이 있고 그 다음 5 개는 제품 코드이고 마지막 8 개는 MSRP가 들어있는 경우이 데이터를 Pig로 어떻게 쿼리합니까? 아마 간단한 것을 놓치고 있을지 모르겠지만, 지금까지 발견 한 모든 것은 데이터를 Pig로로드 할 때 구분자가 필요합니다.돼지가있는 플랫 파일 처리

일부 샘플 데이터는 아래와 같습니다 :

1999ABCDE12234.00 
2000DCEFS00020.00 
2012FFEWS00005.55 

사전에 감사합니다. 위치를 기반으로 라인을 분할하는

제레미

답변

4

한 가지 방법은 REGEX_EXTRACT_ALL을 사용하는 것입니다.

예컨대 :

A = LOAD 'flat.txt' as (line:chararray); 
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line, 
     '^(.{1,4})(.{1,5})(.*)$')) AS (year:int, prod_code:chararray, msrp:double); 
dump B; 
(1999,ABCDE,12234.00) 
(2000,DCEFS,00020.00) 
(2012,FFEWS,00005.55) 
+0

이 방법은 매우 효율적이지 않으며 향후 처리를 위해 구분 기호와 함께 저장하려고한다고 가정합니다. 그 맞습니까? – jwmajors81

+0

이 정규식을 조정할 수는 있지만 구분 기호로 데이터를 저장할 가능성이 있다면 복잡한 정규식을 다루는 것보다 확실히 효과적입니다. –

1

또한, 내장 SUBSTRING 함수,

A = LOAD 'flat.txt' as (line:chararray); 

B = FOREACH A GENERATE SUBSTRING(line,0,3),SUBSTRING(line,4,8),SUBSTRING(line,9,16); 

dump B; 
0

모두 이전 답변 중대가 있습니다. 또한 입력 문자열이 복잡하거나 조건부 구문 분석이 필요한 경우 사용자 고유의 UDF를 구현할 수 있습니다.