如何读取PIG中用分号分隔的csv文件

时间:2015-04-06 03:51:42

标签: hadoop apache-pig

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

E.g。 输入行:"姓名&#34 ;;"年龄&#34 ;;"地址&#34 ;;"简历包含特殊字符,例如;,$#$ @ ^" ;"评价"

输出:这些字段中的每一个都应该加载到列中,特别是"恢复"列应该有" Resume包含特殊字符,例如;,$#$ @ ^"


注意:我已经尝试过PigStorage,CVSLoader,但仍然无法使其工作,因为分隔符也可能在数据中。

3 个答案:

答案 0 :(得分:0)

您可以使用piggybank.jar来阅读此类文件。

首先,您需要在pig脚本中注册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

答案 1 :(得分: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;

答案 2 :(得分:0)

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

示例

<强>输入

"Name";"Age";"Address";"Resume contains special char like ;,$#$@^";"Rating"
"Name1";"Age1";"Address1";"Resume;$# contains ;@^ special char like ;,$#$@^";"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 ;,$#$@^")
("Resume;$# contains ;@^ special char like ;,$#$@^")

注意:
这是非常通用的解决方案,无论输入column(resume)中是否存在任何数量的特殊字符,它都能正常工作。在此脚本中,我仅打印resume column,如果您需要其他列,则包含在relation C中。