2017-05-10 5 views
0

I는 그 구조가 아래와 같이 언급 된 파일을 가지고 난 pigStorage 주면돼지 처리 잘못된 데이터

ID, 이름, 분명히

1,"Amrit,kumar",India 
2,"Vaibhav,arora",USA 
3,"Deepika,kumar",Germany 

주소 ('') 3 개의 필드가 4로 분할되고 데이터가 넘치게됩니다. 대안 :

  1. 나는 돼지 저금통 항아리하지만 문제가 계속 존재하고 여전히 데이터를 시도는 나뿐만 아니라 내가 가진 한 fucntiion를 교체하려 스크립트

    A11 = LOAD 'File.csv.gz' USING org.apache.pig.piggybank.storage.CSVLoader() as (column:type)

  2. 을 검색 할 수 있습니다 spills.Please 35k 행 변경은 모든 행에 대해 gettting이 아닙니다. 데이터가이 경우에도 여전히 유출됩니다. 열 값은 다음 열로 이동합니다. 아래 링크를 참조하십시오.

    how can i ignore " (double quotes) while loading file in PIG?

  3. 은 나뿐만 아니라 CSVEXCEL 저장 및 CSV 로더를 시도했다.

내가 할 수있는 일이 무엇인지 제안 해주세요. 하나의 열에 이름 값을 갖고 싶습니다.

+1

이 '의 모든 인스턴스를 대체 할 정규식을 작성하는 것입니다, '와 같이'' ","a ","b ", c는'1 |"a, b "| c'가되어야한다는 것을 제외하면'|'와 함께 말하면'PigStorage'를 사용하여 자료. – philantrovert

+0

@ philantrovert 여기서 원시 파일을 변경할 수 없습니다. – codaholic

답변

0

4 개의 필드에로드하고 따옴표를 바꾸고 두 번째 필드 뒤에 공백을 추가 한 다음 두 번째 필드와 세 번째 필드를 연결하여 한 필드/열에 전체 이름을 얻습니다. 필요한 외부 항아리가 없습니다.

A = LOAD 'File.csv.gz' USING PigStorage(',') AS (f1:int,f2:chararray,f3:chararray,f4:chararray); 
B = FOREACH A GENERATE 
      f1, 
      CONCAT(REPLACE(f2,'\\"',''),' ') as f2, -- replace beginning quote and add space at end 
      REPLACE(f3,'\\"','') as f3,    -- replace ending quote 
      f4; 
C = FOREACH B GENERATE 
      f1 as id, 
      CONCAT(f2,f3) as name, 
      f4 as country; 
DUMP C; 
+0

돼지 저금통이 잘 작동하고 열 이름 주위에 따옴표가 없어지기 때문에 여기서 교체 할 필요가 없습니다. ** pigStorage (',')를 사용하고 있기 때문에 데이터를 저장할 때 문제가 발생합니다 ** . 내가 concat을 사용하는 경우에도 데이터 사이에 쉼표가 붙습니다. 여기 또는 다른 제안을하기에 가장 적합한 저장 영역 구분자는 무엇입니까 – codaholic

+0

@codaholic 작업 솔루션으로는 충분하지 않습니까? 왜 연결을 사용한다면 쉼표를 사용합니까? pigstorage (',')는 필드를 쉼표로 분리합니다. –

0

는 데이터와이 스크립트를 테스트 :

이제
-- load as four fields 
a = LOAD 'data.txt' using PigStorage(','); 

-- removes single quotes from second and third fields 
b = foreach a generate $0 as id, REPLACE($1, '"', '') as firstname, REPLACE($2, '"', '') as lastname, $0 as address; 

-- combines second and third field with a ',' in between 
c = foreach b generate id, CONCAT(firstname, ',', lastname) as name, address; 

이 결과 테스트 : 당신이 할 수있는 일

test = foreach c generate name; 
dump test; 
(Amrit,kumar) 
(Vaibhav,arora) 
(Deepika,kumar)