我想在Hadoop Pig中避免使用指数表示法。 对于前。
我的输出就像
123,123123,3.8284426969382444E14
如何避免使用指数表示法?
答案 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:<强> 长 强>);