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

Casting in Load vs. in separate step

我有以下数据:

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(第三列)。为此,我创建了以下 pig 脚本,它工作得很好。

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 [=12=] as name:chararray,  as other:chararray,  as gpa:int;
c = group b by name;
d = foreach c generate group, AVG(b.gpa);

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

这看起来像是一个错误,可能会从版本 0.17 中修复。

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

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

b = foreach a generate (chararray)[=10=] as name:chararray, (chararray) as other:chararray, (int) as gpa:int;