1

我遇到了以下问题:

首先我的数据是一个看起来像这样的字符串:小数,小数

例子: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

这意味着我的数据仍然作为字符串而不是双精度排序。有没有人遇到过这个问题并知道如何解决?先感谢您!

4

2 回答 2

0

我不确定为什么 STRSPLIT 会返回一个字符数组,尽管您明确声明它们是双精度的。但是,如果您查看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)
于 2013-07-09T15:12:19.393 回答
0

与其将输出分配给FLATTEN具有两个双精度的模式,不如尝试使用(chararray). 可能是 Pig 仅使用:chararray语法来应用模式检查,但需要显式转换以在执行期间转换类型。

于 2013-07-03T21:28:07.263 回答