2015-04-06 128 views
0

如何读取在PIG中以分号分隔的CSV文件? 数据也可以包含分号。如何在PIG中读取以分号分隔的CSV文件

E.g. 输入行:“名称”;“年龄”;“地址”;“简历包含特殊字符,如$; ^”;“评级”

输出:这些字段中的每一个都应加载到列“简历”一栏应该有“简历包含特殊字符等;,$#$ @ ^”


注:我已经试过PigStorage,CVSLoader但仍然无法使其工作作为分隔符,也可以是数据。

回答

0

您可以使用piggybank.jar来读取这些文件。

首先,您需要在猪脚本中注册piggybank.jar,然后您可以在脚本中使用这些函数。以下是代码片段(我没有测试过这一点,但我敢肯定它会做的伎俩)

REGISTER 'piggybank-0.12.0.jar'; 

DEFINE CSVExcelStorage org.apache.pig.piggybank.storage.CSVExcelStorage(); 

input_lines = LOAD 'PATH/TO/FILES' using CSVExcelStorage(';', 'YES_MULTILINE') AS (name:chararray, age:int, address:chararray, details:chararray); 

欲了解更多详情,请参阅thisthis

0

尝试此解决方案。

A = load 'pigconcat' using PigStorage(';') as (a:chararray,b:chararray,c:chararray,d:chararray,e:chararray,f:chararray); 

B = foreach A GENERATE a,b,c,CONCAT(CONCAT(d,';'),e) as (resume:chararray),f; 

C= foreach B GENERATE resume; 

dump C; 
0

如果定界符也存在于输入数据,那么我的建议是去为Regex,而不是任何加载技术(PigStorage,CSVStorage)。这将为您的输入提供更多的灵活性和控制力。我同意许多人因为复杂的本质而不会去Regex,但这些问题可以使用正则表达式轻松解决。

样品例如

输入

"Name";"Age";"Address";"Resume contains special char like ;,$#[email protected]^";"Rating" 
"Name1";"Age1";"Address1";"Resume;$# contains ;@^ special char like ;,$#[email protected]^";"Rating" 

PigScript:

A = LOAD 'input' AS (line:chararray); 
B = FOREACH A GENERATE FLATTEN(REGEX_EXTRACT_ALL(line,'("\\w+");("\\w+");("\\w+");("[\\w+\\s;$,#@^]+");("\\w+")')) AS(name,age,address,resume,rating); 
C = FOREACH B GENERATE resume; 
DUMP C; 

输出:

("Resume contains special char like ;,$#[email protected]^") 
("Resume;$# contains ;@^ special char like ;,$#[email protected]^") 

注:
这是非常通用的解决方案,也将努力无论任何数量的本特殊字符在输入column(resume)。在这个脚本中,我只打印了resume column,如果您需要其他列,请将其包含在relation C中。

相关问题