类型中的例外 Chararry 在 PIG 中加倍



我有一个示例输入作为制表符分隔键,值对如下

B_1001@2012-06-15   96.73429163933419@0.5511284347710459
B_1001@2012-06-18   187.4348199976547@0.5544551559243536
B_1002@2012-09-26   745.4912066349087@0.8398570478932768
B_1002@2012-09-28   60.97117969729124@0.8500267379723409

我正在将此文件加载到 pig 中并执行以下操作

a = load '/home/HadoopUser/Desktop/a.txt' as (key:chararray, value:chararray);
describe a;
a: {key: chararray,value: chararray}
b = foreach a generate key, flatten(STRSPLIT(value,'@',2)) as (v1:double,v2:float);
describe b;
b: {key: chararray,v1: double,v2: float}
c = group b by key;
 describe c;
c: {group: chararray,b: {key: chararray,v1: double,v2: float}}

这一直有效到这里但当我在 b.v1 上使用 Arthematical 计算时,我得到了 ClassCastException,因为 java.lang.String 不能强制转换为 java.lang.Double

但描述没有错误

d = foreach c generate group,SUM(b.v1);
describe d;
d: {group: chararray,double}

当我转储 d 时; 它 id 给出异常

我什至也尝试过类型转换"b"

b = foreach a generate key, (tuple (double,double))STRSPLIT(value,'@',2); 

现在当我描述 b;它给出的错误为无法将具有架构元组的元组转换为具有架构元组的元组({double,double})

请帮助我知道为什么它会像这样出现,即使描述显示正确的架构。

我以前也遇到过这个问题。我现在找不到它的 bug 跟踪器链接,但是当您使用类似 B = FOREACH A GENERATE key AS key: chararray 的语句设置类型/"cast"时,它实际上不会强制转换类型(但它会更改 DESCRIBE 的输出)。你是对的,你必须做一个明确的强制转换,文档说你可以将一个字符数组转换为双精度。尝试类似操作:

b1 = FOREACH b GENERATE key, (double)v1, (float)v2 ;

更新:这是指向该错误的链接:https://issues.apache.org/jira/browse/PIG-2315

最新更新