1003在pig的group函数中出错(找不到别名的操作符)

4jb9z9bj  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(301)

我编写了一个.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列中输入美元值,然后按jobtitle对数据进行分组。当我使用run命令运行这个命令时,没有错误。即使是2010年的倾销也很有效。但JobTitiel的倾销是错误的:
倾倒错误
日志文件的输出为:
pig堆栈跟踪

gkl3eglg

gkl3eglg1#

------错误1003:找不到别名byjobtitle的运算符
org.apache.pig.impl.logicalayer.frontendexception:错误1003:在org.apache.pig.pigserver$graph.buildplan(pigserver)中找不到别名byjobtitle的运算符。java:1544)在org.apache.pig.pigserver.storeex(pigserver。java:1029)在org.apache.pig.pigserver.store(pigserver。java:997)在org.apache.pig.pigserver.openiterator(pigserver。java:910) 位于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)在org.apache.pig.main.run(main。java:565)在org.apache.pig.main.main(main。java:177)在sun.reflect.nativemethodaccessorimpl.invoke0(本机方法)在sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl)。java:57)在sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl。java:43)在java.lang.reflect.method.invoke(方法。java:606)在org.apache.hadoop.util.runjar.run(runjar。java:221)在org.apache.hadoop.util.runjar.main(runjar。java:136)
我是新来的大数据,没有太多的知识。但看起来数据类型有问题。有人能帮我吗?

bwntbbo3

bwntbbo32#

问题是由于您使用的“csvloader”。这将有','作为默认分隔符。由于您的数据在某些字段(如薪资和差旅)中也包含“,”,因此位置索引正在更改。如果你的数据是这样的
姓名职务薪资出差组织类型组织年度
a b 10000 231357组织类型组织2016
然后使用csvloader将“a b 10”作为第一个字段,“000 23”作为第二个字段,“1357 org\ U 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');

只要不存在相同的标识符,它就可以正常工作;
分隔符
任何字段值

相关问题