如何在pig中读取以分号分隔的csv文件

ovfsdjhp  于 2021-05-30  发布在  Hadoop
关注(0)|答案(3)|浏览(400)

如何在pig中读取以分号分隔的csv文件?数据也可以包含分号。
e、 输入行:“名称”年龄“;”地址“;”简历包含特殊字符,如;,$#$@^“;”“评级”
输出:这些字段中的每一个都应该加载到列中,特别是“resume”列应该有“resume contains special char like;,$#$@^”
注意:我试过pigstorage,cvsloader,但仍然不能使它工作,因为分隔符也可能在数据中。

fxnxkyjh

fxnxkyjh1#

试试这个办法。

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;
pgky5nke

pgky5nke2#

你可以用 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);

有关更多详细信息,请参阅此和此

sdnqo3pr

sdnqo3pr3#

如果输入数据中也存在分隔符,那么我的建议是 Regex 而不是任何加载技术( PigStorage,CSVStorage ). 这将为您的输入提供更灵活的控制。我同意很多人不喜欢 Regex 由于自然界的复杂性,使用正则表达式可以很容易地解决这类问题。
示例
输入

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

Pig手稿:

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 .

相关问题