结果在Pig中转换为double,但仍然以字符串形式排序

时间:2013-07-03 20:35:14

标签: casting apache-pig

我遇到了以下问题:

首先我的数据是一个如下所示的字符串: 小数,小数

示例:1.345, 3.456

我使用以下猪脚本将此列(例如QQ)分为两列:

result = FOREACH old_table GENERATE FLATTEN(STRSPLIT(QQ, ',')) as (COL1: double, COL2: double);

然后,我想先通过第一个字段,然后是第二个字段来订购它。

result_ordered = ORDER result BY COL1, COL2;

但是,我得到的结果如下:

> 59.619198977071434    -151.4586740547339
> 60.52611316847121 -150.8005347076273
> 64.8310014577408  -147.84786488835852
> 7.059652849999997 125.59985130999996

这意味着我的数据仍然是以字符串形式排序而不是双重排序。有没有人遇到过这个问题并知道如何解决它?提前谢谢!

2 个答案:

答案 0 :(得分:0)

不是将FLATTEN的输出分配给具有两个双精度的模式,而是尝试使用(chararray)实际投射字段。可能是Pig只使用:chararray语法来应用模式检查,但需要显式强制转换才能在执行期间转换类型。

答案 1 :(得分:0)

我不确定为什么STRSPLIT会返回一个chararray虽然你明确声明它们是双打的。但是如果你看http://pig.apache.org/docs/r0.10.0/basic.html#arithmetic,请注意chararrays不能乘以1.0加倍,但是bytearrays可以。因此,您可以执行以下操作:

result = FOREACH old_table 
       GENERATE FLATTEN(STRSPLIT(QQ, ',')) AS (COL1: bytearray, COL2: bytearray);

B = FOREACH result GENERATE 1.0 * COL1 AS COL1, 1.0 * COL2 AS COL2 ;

result_ordered = ORDER B BY COL1, COL2;

这给了我正确的输出:

result_ordered: {COL1: double,COL2: double}
(7.059652849999997,125.59985130999996)
(59.619198977071434,-151.4586740547339)
(60.52611316847121,-150.8005347076273)
(64.8310014577408,-147.84786488835852)