避免在Hadoop猪中使用Exponent表示法

时间:2012-11-10 04:31:45

标签: java hadoop apache-pig

我想在Hadoop Pig中避免使用指数表示法。 对于前。

我的输出就像

123,123123,3.8284426969382444E14

如何避免使用指数表示法?

4 个答案:

答案 0 :(得分:7)

您可以使用BigDecimal.toPlainString()

  

返回此BigDecimal的字符串表示形式,不带指数字段。

示例:

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

输出:

382844269693824.44

答案 1 :(得分:0)

您的问题是Java在数字变得非常大时所做的舍入错误。您可以发布您的代码,以便我可以查看它吗?

答案 2 :(得分:0)

要删除指数表示法,请创建一个自定义UDF,它返回Reimeus提到的double值的String表示形式。 E.g:

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脚本中使用它:

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

答案 3 :(得分:0)

如果您在从平面文件中检索数据时添加数据类型,那么您可以避免这种情况。 例如 使用PigStorage(',')作为记录= LOAD' FILE_NAME '                         (D1: chararray ,D2: chararray ,D3: chararray ,D4:<强> D5:<强> 下,d6中: chararray ,D7: chararray ,D8: chararray ,d9: ,d10: ,d11: long 下,D12:<强> );