2012-11-10 40 views

回答

7

您可以使用BigDecimal.toPlainString()

返回此BigDecimal的字符串表示不帶指數字段。

例子:

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

輸出:

382844269693824.44 
+0

也有使用DecimalFormat直接格式化double的選項,但我認爲BigDecimal解決方案對於此問題更簡單。 –

0

你的問題是舍入誤差時,一些受到很大Java那樣。你可以發佈你的代碼,所以我可以看看它嗎?

0

要擺脫指數表示法,請創建一個自定義UDF,它返回Reimeus所述的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)); 
    } 

} 

它打包在一個罐子能在一個豬腳本中使用它:只要

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

如果添加的數據類型,而從平面文件,然後檢索這些數據,您可以避免這一點。 例如 記錄= LOAD 'FILE_NAME' 使用PigStorage( '')作爲 (D1:chararray,D2:chararray,D3:chararray,D4:, D5:,d6中:chararray,D7:chararray,D8:chararray,D9:,D10:,D11:,D12:);