在负载中投射与在单独步骤中投射

时间:2017-06-04 20:27:23

标签: apache-pig

我有以下数据:

John,fl,3
John,wt,3
John,sp,4
John,sm,3
Mary,fl,3
Mary,wt,3
Mary,sp,4
Mary,sm,4

我想按名称(第一列)计算数据中的平均gpa(第3列)。为此我创建了以下猪脚本,它工作正常。

a = LOAD '/root/sample.txt' using PigStorage(',') as (name:chararray, other:chararray, gpa:int);
b = group a by name;
c = foreach b generate group, AVG(a.gpa);

然后我重写下面的相同脚本。这次在一个单独的步骤中而不是加载而是在代码下面强制转换列给出了转换异常错误:

java.lang.Exception: java.lang.ClassCastException: org.apache.pig.data.DataByteArray cannot be cast to java.lang.String
    at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)

a = LOAD '/root/sample.txt' using PigStorage(',');
b = foreach a generate $0 as name:chararray, $1 as other:chararray, $2 as gpa:int;
c = group b by name;
d = foreach c generate group, AVG(b.gpa);

我无法理解为什么???这两个代码示例有何不同?

1 个答案:

答案 0 :(得分:0)

这看起来像一个可能从版本修复的错误 - 0.17。

参考:Run a String through Java using Pighttps://issues.apache.org/jira/browse/PIG-2315了解详情。

截至目前,对于第二种工作方法,需要使用显式类型转换。

b = foreach a generate (chararray)$0 as name:chararray, (chararray)$1 as other:chararray, (int)$2 as gpa:int;