如何读取在PIG中以分号分隔的CSV文件? 数据也可以包含分号。如何在PIG中读取以分号分隔的CSV文件
E.g. 输入行:“名称”;“年龄”;“地址”;“简历包含特殊字符,如$; ^”;“评级”
输出:这些字段中的每一个都应加载到列“简历”一栏应该有“简历包含特殊字符等;,$#$ @ ^”
注:我已经试过PigStorage,CVSLoader但仍然无法使其工作作为分隔符,也可以是数据。
如何读取在PIG中以分号分隔的CSV文件? 数据也可以包含分号。如何在PIG中读取以分号分隔的CSV文件
E.g. 输入行:“名称”;“年龄”;“地址”;“简历包含特殊字符,如$; ^”;“评级”
输出:这些字段中的每一个都应加载到列“简历”一栏应该有“简历包含特殊字符等;,$#$ @ ^”
注:我已经试过PigStorage,CVSLoader但仍然无法使其工作作为分隔符,也可以是数据。
您可以使用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);
尝试此解决方案。
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
,但这些问题可以使用正则表达式轻松解决。
样品例如
输入
"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
中。