Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 如何在PIG中读取以分号分隔的csv文件_Hadoop_Apache Pig - Fatal编程技术网

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

Hadoop 如何在PIG中读取以分号分隔的csv文件,hadoop,apache-pig,Hadoop,Apache Pig,如何在PIG中读取以分号分隔的CSV文件? 数据还可以包含分号 例如。 输入行:名称;年龄住址简历包含特殊字符,如;,$$@^;评级 输出:这些字段中的每一个都应该加载到列中,特别是恢复列应该包含特殊字符,如;,$$@^ 注意:我尝试了PigStorage、CVSLoader,但仍然无法使其工作,因为分隔符也可能在数据中。您可以使用piggybank.jar读取此类文件 首先需要在pig脚本中注册piggybank.jar,然后才能在脚本中使用函数。下面是我还没有测试过的代码片段,但我相信它会成

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

例如。 输入行:名称;年龄住址简历包含特殊字符,如;,$$@^;评级

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

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

您可以使用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);
有关更多详细信息,请参阅并尝试此解决方案

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。这将为您的输入提供更灵活的控制。我同意许多ppl不会使用正则表达式,因为它本质上很复杂,但是使用正则表达式可以很容易地解决这类问题

示例

输入

笔迹:

输出:

注: 这是一个非常通用的解决方案,无论输入栏中有多少特殊字符,它都可以工作。在这个脚本中,我只打印了resume列,以防您需要其他列,然后包含在关系C中

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