结果在pig中被转换为double,但仍然作为字符串进行排序

a64a0gku  于 2021-06-24  发布在  Pig
关注(0)|答案(2)|浏览(249)

我遇到了以下问题:
首先,我的数据是这样一个字符串:小数,小数
例子: 1.345, 3.456 我用下面的Pig脚本把这个专栏,比如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

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

91zkwejq

91zkwejq1#

我不知道为什么strsplit返回一个chararray,尽管你明确地说它们是双精度的。但如果你看看http://pig.apache.org/docs/r0.10.0/basic.html#arithmetic,请注意,chararray不能乘以1.0,但bytearray可以。因此,您可以执行以下操作:

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)
dwbf0jvd

dwbf0jvd2#

而不是指定 FLATTEN 对于具有两个双精度的模式,请尝试使用 (chararray) . 可能是Pig只使用 :chararray 用于应用模式检查的语法,但在执行期间需要显式转换来转换类型。

相关问题