Skip to content

Commit 1a240e5

Browse files
BigDecimalSplitter rounding fix.
1 parent 90856c0 commit 1a240e5

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

database-commons/src/main/java/io/cdap/plugin/db/source/DataDrivenETLDBInputFormat.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,24 @@
2626
import org.apache.hadoop.mapreduce.InputSplit;
2727
import org.apache.hadoop.mapreduce.RecordReader;
2828
import org.apache.hadoop.mapreduce.TaskAttemptContext;
29+
import org.apache.hadoop.mapreduce.lib.db.BigDecimalSplitter;
2930
import org.apache.hadoop.mapreduce.lib.db.DBConfiguration;
3031
import org.apache.hadoop.mapreduce.lib.db.DBInputFormat;
32+
import org.apache.hadoop.mapreduce.lib.db.DBSplitter;
3133
import org.apache.hadoop.mapreduce.lib.db.DBWritable;
3234
import org.apache.hadoop.mapreduce.lib.db.DataDrivenDBInputFormat;
3335
import org.slf4j.Logger;
3436
import org.slf4j.LoggerFactory;
3537

3638
import java.io.IOException;
39+
import java.math.BigDecimal;
40+
import java.math.RoundingMode;
3741
import java.sql.Connection;
3842
import java.sql.Driver;
3943
import java.sql.DriverManager;
4044
import java.sql.SQLException;
4145
import java.sql.Statement;
46+
import java.sql.Types;
4247
import java.util.Properties;
4348

4449
/**
@@ -169,6 +174,26 @@ public void close() throws IOException {
169174
};
170175
}
171176

177+
@Override
178+
protected DBSplitter getSplitter(int sqlDataType) {
179+
if (sqlDataType == Types.NUMERIC || sqlDataType == Types.DECIMAL) {
180+
return new CustomBigDecimalSplitter();
181+
}
182+
return super.getSplitter(sqlDataType);
183+
}
184+
185+
static class CustomBigDecimalSplitter extends BigDecimalSplitter {
186+
@Override
187+
protected BigDecimal tryDivide(BigDecimal numerator, BigDecimal denominator) {
188+
BigDecimal size = numerator.divide(denominator, RoundingMode.HALF_UP);
189+
if (size.compareTo(new BigDecimal("0")) <= 0) {
190+
int effectiveScale = Math.max(numerator.scale(), denominator.scale()) + 5;
191+
return numerator.divide(denominator, effectiveScale, RoundingMode.HALF_UP);
192+
}
193+
return size;
194+
}
195+
}
196+
172197
@Override
173198
protected void closeConnection() {
174199
super.closeConnection();

0 commit comments

Comments
 (0)