我写了一个.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是错误的:
日志文件的输出是:
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的新手并且没有太多的知识。但看起来数据类型存在问题。任何人都可以帮助我吗?
答案 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');
只要不存在相同的标识符,它就能正常工作;