我遇到了以下问题:
首先我的数据是一个如下所示的字符串: 小数,小数
示例: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
这意味着我的数据仍然是以字符串形式排序而不是双重排序。有没有人遇到过这个问题并知道如何解决它?提前谢谢!
答案 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)