2017-05-10 30 views
0

我有,其结构类似下面文件:猪处理不正确的数据

ID,姓名,地址

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

显然,如果我给pigStorage(“”)这三个字段将被分成4个字节,数据溢出。 替代方案:

  1. 我试着存钱罐罐子,但问题仍然存在,仍然是数据spills.Please找到脚本

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

  2. 我试着更换fucntiion以及我在下面35K行的变化并不适用于所有的rows.Any流汗走位如何将数据仍然在这种情况下,well.Column值溢出得到转移到下一个column.Please找到简称链接下方。

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

  3. 我试图CSVEXCEL存储和CSV装载机为好。

请提出我在这里可以做的事情。我想要在单个列中具有名称值。

+1

你可以做的是写一个正则表达式,将取代'所有情况下, '有说'|'除了是之间的那些' “ ”''像1,“ A,b”,C'应该成为'1 | “A,b” | C'那么你可以使用'PigStorage'加载数据。 – philantrovert

+0

@ philantrovert我不能在这里改变原始文件。 – codaholic

回答

0

载入到4场,更换报价,第二场后添加一个空格,最后Concat的第二和第三场在一个领域取得的全名/所需column.No外部罐子。

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的数据将有它之间的逗号。什么是最好的存储delimitter给这里或任何其他建议 – codaholic

+0

@codaholic一个工作的解决方案是不够的?如果你使用concat,为什么你会有逗号? 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)