在pig中将字符类型转换为double时出现异常

t98cgbkg  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(389)

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

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上使用算术计算时,我得到了classcastexception,因为java.lang.string不能转换为java.lang.double
但描述没有错误

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

当我甩了d;这是个例外
我甚至还试过打“b”

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

现在当我描述b时;它给出了一个错误,因为无法将具有模式元组的元组强制转换为具有模式元组的元组({double,double})
请帮助我知道为什么会这样,即使描述正确的模式。

zdwk9cvp

zdwk9cvp1#

我以前也经历过这个问题。我现在找不到它的bug tracker链接,但是当你用如下语句设置type/'cast'时 B = FOREACH A GENERATE key AS key: chararray 它实际上不会强制转换类型(但会更改 DESCRIBE ). 你是对的,你必须做一个显式的转换,医生说你可以把一个字符转换成一个双精度字符。尝试以下操作:

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

更新:以下是错误的链接:https://issues.apache.org/jira/browse/pig-2315

相关问题