HadoopPigでの指数表記は避けたいです。例:
私の出力は次のようなものです
123,123123,3.8284426969382444E14
どうすればその指数表記を回避できますか?
HadoopPigでの指数表記は避けたいです。例:
私の出力は次のようなものです
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));
}
}
Pigスクリプトで使用できるように、jarにパックします。
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);
...
フラットファイルからデータを取得しているときにデータ型を追加すると、それを回避できます。例:records = LOAD'FILE_NAME ' using PigStorage('、')as(d1:chararray、d2:chararray、d3:chararray、d4:long、d5:long、d6:chararray、d7:chararray、d8:chararray、d9:long、d10:long、d11:long、d12:long);