2

HadoopPigでの指数表記は避けたいです。例:

私の出力は次のようなものです

123,123123,3.8284426969382444E14

どうすればその指数表記を回避できますか?

4

4 に答える 4

7

BigDecimal.toPlainString()を使用できます:

指数フィールドのないこのBigDecimalの文字列表現を返します。

例:

BigDecimal number = new BigDecimal("3.8284426969382444E14");
System.out.println(number.toPlainString());

出力:

382844269693824.44
于 2012-11-10T04:39:18.577 に答える
0

問題は、数値が非常に大きくなったときにJavaが行う丸め誤差です。私がそれを見ることができるようにあなたのコードを投稿できますか?

于 2012-11-10T04:40:15.230 に答える
0

指数表記を取り除くには、UDFReimeusが述べたようにdouble値の文字列表現を返すカスタムを作成します。例えば:

package com.example;

import java.io.IOException;
import java.math.BigDecimal;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.DataType;
import org.apache.pig.data.Tuple;
import org.apache.pig.impl.logicalLayer.schema.Schema;

public class DoubleConverter extends EvalFunc<String> {

    @Override
    public String exec(Tuple input) throws IOException {
        if (input == null || input.size() == 0) {
            return null;
        }
        try {
            Double num = (Double) input.get(0);
            if (num == null) {
                return null;
            }

            BigDecimal bigDecimal = new BigDecimal(num);
            return bigDecimal.toPlainString();
        }
        catch (Exception e) {
            throw new RuntimeException("DoubleConverter error", e);
        }
    }

    @Override
    public Schema outputSchema(Schema input) {
        return new Schema(new Schema.FieldSchema(null, DataType.CHARARRAY));
    }

}

Pigスクリプトで使用できるように、jarにパックします。

register '/home/user/test/myjar.jar';
DEFINE convertDouble com.example.DoubleConverter();
A = load '/user/hadoop/store/sample/sample.txt' using PigStorage(',') as  
      (id1:int,id2:int,id3:double);
B = foreach A generate id1,id2, convertDouble(id3);
...
于 2012-11-11T14:25:54.437 に答える
0

フラットファイルからデータを取得しているときにデータ型を追加すると、それを回避できます。例:records = LOAD'FILE_NAME ' using PigStorage('、')as(d1:chararray、d2:chararray、d3:chararray、d4:long、d5:long、d6:chararray、d7:chararray、d8:chararray、d9:long、d10:long、d11:long、d12:long);

于 2016-04-14T22:39:35.910 に答える