猪的组函数中的 1003 错误(无法找到别名的运算符)

Posted

技术标签:

【中文标题】猪的组函数中的 1003 错误(无法找到别名的运算符)【英文标题】:1003 error (unable to find an operator for alias ) in group function in pig 【发布时间】:2016-06-07 17:32:01 【问题描述】:

我写了一个 .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 列中删除美元价值的',',然后按职位对数据进行分组。当我使用运行命令运行它时,没有错误。即使是 year2010 的倾销工作也很好。但是转储 byjobtiiel 给出了错误:

error in dumping

日志文件的输出是:

猪堆栈跟踪 --------------- ERROR 1003: Unable to find an operator for alias byjobtitle

org.apache.pig.impl.logicalLayer.FrontendException:错误 1003:无法 在以下位置查找别名 byjobtitle 的运算符 org.apache.pig.PigServer$Graph.buildPlan(PigServer.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(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.apache.hadoop.util.RunJar.run(RunJar.java:221) 在 org.apache.hadoop.util.RunJar.main(RunJar.java:136)

我是大数据新手,知识不多。但看起来数据类型有问题。谁能帮帮我?

【问题讨论】:

【参考方案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');

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

分隔符 任何字段值

【讨论】:

您的答案急需编辑。我第一次通过,但你一定要扫过。 感谢乔纳森的编辑。以后会写出简短明了的答案 是的,我希望它至少有点帮助。我对 Hadoop 或 Apache 一无所知,所以我很感谢你关注我的争执。

以上是关于猪的组函数中的 1003 错误(无法找到别名的运算符)的主要内容,如果未能解决你的问题,请参考以下文章

有人能解释一下猪的这个奇怪的错误吗

请求 Auth0-Authorization 扩展中的组列表但返回 403:Insufficient 范围错误

“错误无法找到浏览器。 “saucelabs:Chrome@83.0:Windows10”不是浏览器别名或可执行文件的路径

变量,数据类型和运算符

Mysql无效使用带Count的组函数?

Gatsby 站点地图:GraphQLError:语法错误:预期名称,找到 <EOF>