繁体   English   中英

如何在PIG中读取以分号分隔的CSV文件

[英]How to read csv file seperated by semicolon in PIG

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

例如,输入行:“名称”;“年龄”;“地址”;“继续包含特殊字符,如;,$#$ @ ^”;“评级”

输出:这些字段中的每个字段均应装入列中,尤其是“ Resume”列应具有“ Resume包含特殊字符,如;,$#$ @ ^”


注意:我已经尝试了PigStorage,CVSLoader,但是仍然不能使它工作,因为分隔符也可以存在于数据中。

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

首先,您需要在Pig脚本中注册ggybankbank.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);

欲了解更多详情,请参阅

试试这个解决方案。

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;

如果在输入数据中也存在定界符,那么我的建议是使用Regex而不是使用任何加载技术( PigStorage,CSVStorage )。 这将在您的输入中提供更多的灵活性和控制力。 我同意由于性质复杂,许多人不会选择Regex ,但是使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM