使用CONCAT时无法打开别名的迭代器

时间:2014-04-08 06:04:25

标签: apache-pig

尝试从原始数据中拆分列并需要重新加入。 为此,我创建了一个rowid和originaldata,并从原始数据中分离了一个col以及连接rowid

originaldata = load '$input' using PigStorage('$delimiter');
rankedoriginaldata = rank originaldata;
numericdata = foreach rankedoriginaldata generate CONCAT($0,$split);

但我无法做这个陈述

numericdata = foreach rankedoriginaldata generate CONCAT($0,$split);

命令

pig -x local -f seperator.pig -param input=data/StringNum.csv -param output=OUT/Numericfile -param delimiter="," -param split='$3'

它显示以下堆栈树

Pig Stack Trace
---------------
ERROR 1066: Unable to open iterator for alias numericdata

org.apache.pig.impl.logicalLayer.FrontendException: ERROR 1066: Unable to open iterator for alias numericdata
    at org.apache.pig.PigServer.openIterator(PigServer.java:838)
    at org.apache.pig.tools.grunt.GruntParser.processDump(GruntParser.java:696)
    at org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:320)
    at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:194)
    at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:170)
    at org.apache.pig.tools.grunt.Grunt.exec(Grunt.java:84)
    at org.apache.pig.Main.run(Main.java:475)
    at org.apache.pig.Main.main(Main.java:157)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.hadoop.util.RunJar.main(RunJar.java:208)
Caused by: java.io.IOException: Job terminated with anomalous status FAILED
    at org.apache.pig.PigServer.openIterator(PigServer.java:830)
    ... 12 more
================================================================================

但是当我做的时候

numericdata = foreach originaldata generate CONCAT($0,$split);

我得到了预期的输出。

怀疑:加载数据时,元组的顺序会发生变化吗? 如果我们正在加载数据说

1,4,6
3,8,9
2,4,5

订购方式如何? 是否像

一样洗牌
1,6,4
8,9,3...

1 个答案:

答案 0 :(得分:2)

首先尝试将CONCAT的参数转换为chararray:

numericdata = foreach originaldata generate CONCAT((chararray)$0,(chararray)$split);

我认为演员是必要的,因为CONCAT需要两个字符。 RANK会生成一个Long(您将$ 0传递给CONCAT)。

关于您的疑问:元组中字段的顺序不会改变。然而,关系中元组的顺序可能会改变。