我想避免Hadoop Pig中的指數表示法。 例如。避免Hadoop Pig中的指數表示法
我的輸出類似
123,123123,3.8284426969382444E14
我怎樣才能避免這種情況的指數符號?
我想避免Hadoop Pig中的指數表示法。 例如。避免Hadoop Pig中的指數表示法
我的輸出類似
123,123123,3.8284426969382444E14
我怎樣才能避免這種情況的指數符號?
您可以使用BigDecimal.toPlainString():
返回此BigDecimal的字符串表示不帶指數字段。
例子:
BigDecimal number = new BigDecimal("3.8284426969382444E14");
System.out.println(number.toPlainString());
輸出:
382844269693824.44
你的問題是舍入誤差時,一些受到很大Java那樣。你可以發佈你的代碼,所以我可以看看它嗎?
要擺脫指數表示法,請創建一個自定義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);
...
如果添加的數據類型,而從平面文件,然後檢索這些數據,您可以避免這一點。 例如 記錄= LOAD 'FILE_NAME' 使用PigStorage( '')作爲 (D1:chararray,D2:chararray,D3:chararray,D4:長, D5:長,d6中:chararray,D7:chararray,D8:chararray,D9:長,D10:長,D11:長,D12:長);
也有使用DecimalFormat直接格式化double的選項,但我認爲BigDecimal解決方案對於此問題更簡單。 –