1

次の問題が発生しました。

まず、私のデータは次のような文字列です: decimals, decimals

例:1.345, 3.456

次のピッグ スクリプトを使用して、この列 (QQ など) を 2 つの列に配置しました。

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

次に、最初のフィールド、次に2番目のフィールドで注文したいと思います。

result_ordered = ORDER result BY COL1, COL2;

しかし、次のような結果が得られました。

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

これは、データがまだ double ではなく文字列として順序付けられていることを意味します。誰かがこの問題に遭遇し、それを解決する方法を知っていますか? 前もって感謝します!

4

2 に答える 2

0

の出力を 2 つの double を持つスキーマに割り当てる代わりに、FLATTEN実際にフィールドを でキャストしてみてください(chararray)。Pig は:chararrayスキーマ チェックを適用するための構文のみを使用している可能性がありますが、実行中に型を変換するには明示的なキャストが必要です。

于 2013-07-03T21:28:07.263 に答える
0

double であると明示的に述べているにもかかわらず、STRSPLIT が chararray を返す理由がわかりません。しかし、http://pig.apache.org/docs/r0.10.0/basic.html#arithmetic を見ると chararray は 1.0 を掛けて double にすることはできませんが、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)
于 2013-07-09T15:12:19.393 に答える