在猪

时间:2016-06-07 17:32:02

标签: hadoop apache-pig bigdata

我写了一个.pig文件,其内容是:

register /home/tuhin/Documents/PigWork/pigdata/piggybank.jar;
define replace org.apache.pig.piggybank.evaluation.string.REPLACE();
define csvloader org.apache.pig.piggybank.storage.CSVLoader();
xyz = load '/pigdata/salaryTravelReport.csv' using csvloader();
x = foreach xyz generate $0 as name:chararray, $1 as title:chararray, replace($2, ',','')  as salary:bytearray, replace($3, ',', '') as travel:bytearray, $4 as orgtype:chararray, $5 as org:chararray, $6 as year:bytearray;
refined = foreach x generate name, title, (float)salary, (float)travel, orgtype, org, (int)year;
year2010 = filter refined by year == 2010;
byjobtitile = GROUP year2010 by title;

目的是删除2列中美元值的',',然后按作业标题对数据进行分组。当我使用run命令运行它时,没有错误。甚至2010年的倾销工作正常。但倾销byjobtitiel是错误的:

error in dumping

日志文件的输出是:

  

Pig Stack Trace   ---------------错误1003:无法通过jobtitle

找到别名的运算符      

org.apache.pig.impl.logicalLayer.FrontendException:错误1003:无法使用   通过jobtitle找到别名的运算符   org.apache.pig.PigServer $ Graph.buildPlan(PigServer.java:1544)at at   org.apache.pig.PigServer.storeEx(PigServer.java:1029)at   org.apache.pig.PigServer.store(PigServer.java:997)at   org.apache.pig.PigServer.openIterator(PigServer.java:910)at   org.apache.pig.tools.grunt.GruntParser.processDump(GruntParser.java:754)     在   org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:376)     在   org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:230)     在   org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:205)     在org.apache.pig.tools.grunt.Grunt.run(Grunt.java:66)at   org.apache.pig.Main.run(Main.java:565)at   org.apache.pig.Main.main(Main.java:177)at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:606)at   org.apache.hadoop.util.RunJar.run(RunJar.java:221)at   org.apache.hadoop.util.RunJar.main(RunJar.java:136)

我是bigdata的新手并且没有太多的知识。但看起来数据类型存在问题。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

问题归因于" CSVLoader"您正在使用。这将有','作为默认分隔符。由于您的数据也有","在薪水和旅行等领域,位置指数正在发生变化。所以,如果您的数据是这样的

  

名称标题工资旅行组织年份
      A B 10,000 23,1357 ORG_TYPE ORG 2016

然后使用CSVLoader将使" A B 10"作为第一个领域," 000 23"作为第二个领域和" 1357 ORG_TYPE ORG 2016"作为基于","

的第三个字段
register /Users/rakesh/Documents/SVN/iReporter/iReporterJobFramework/avro/lib/1.7.5/piggybank.jar;
define replace org.apache.pig.piggybank.evaluation.string.REPLACE();
define csvloader org.apache.pig.piggybank.storage.CSVLoader();
xyz = load '<path to your file>' using csvloader();
a = foreach xyz generate $0;


2016-06-07 12:28:12,384 [main] INFO  org.apache.pig.backend.hadoop.executionengine.util.MapRedUtil - Total input paths to process : 1<br>
(A  B   10)<br>

您可以使分隔符不同,以使其不存在于任何字段值中。

尝试使用CSVExcelStorage。您可以使用其构造函数显式定义分隔符

register /Users/rakesh/Documents/SVN/iReporter/iReporterJobFramework/avro/lib/1.7.5/piggybank.jar;
define replace org.apache.pig.piggybank.evaluation.string.REPLACE();
define CSVExcelStorage org.apache.pig.piggybank.storage.CSVExcelStorage('|','NO_MULTILINE','NOCHANGE');

只要不存在相同的标识符,它就能正常工作;

  • 定界符
  • 任何字段值