2

我想避免在 Hadoop Pig 中使用指数符号。例如。

我的输出就像

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

要摆脱指数符号,请创建一个自定义UDF,该自定义返回 Reimeus 提到的双精度值的字符串表示形式。例如:

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));
    }

}

将其打包到 jar 中,以便能够在 Pig 脚本中使用它:

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

您的问题是当数字变得非常大时 Java 所做的舍入错误。你能把你的代码贴出来让我看看吗?

于 2012-11-10T04:40:15.230 回答
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:,d10:,d11:,d12:);

于 2016-04-14T22:39:35.910 回答