在负载中投射与在单独的步骤中投射
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;
我有以下数据:
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;