我想避免在 Hadoop Pig 中使用指数符号。例如。
我的输出就像
123,123123,3.8284426969382444E14
我怎样才能避免这种指数符号?
我想避免在 Hadoop Pig 中使用指数符号。例如。
我的输出就像
123,123123,3.8284426969382444E14
我怎样才能避免这种指数符号?
您可以使用BigDecimal.toPlainString():
返回此 BigDecimal 的字符串表示形式,不带指数字段。
例子:
BigDecimal number = new BigDecimal("3.8284426969382444E14");
System.out.println(number.toPlainString());
输出:
382844269693824.44
要摆脱指数符号,请创建一个自定义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);
...
您的问题是当数字变得非常大时 Java 所做的舍入错误。你能把你的代码贴出来让我看看吗?
如果您在从平面文件中检索数据的同时添加数据类型,那么您可以避免这种情况。例如 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:长);